Форум программистов, компьютерный форум CyberForum.ru

синхронизация потоков - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Чтение из файла и запись в файл http://www.cyberforum.ru/cpp-beginners/thread999659.html
Доброго времени суток. Идея в чем: Пример входных данных из файла: 5 o 3 c 4 o 5 c 6 o 7
C++ Двойной связный список Добрый день. Проблема со списком такая. Нужна проверка на повторение введённых чисел. Условие такое что числа не могут повторятся. Подскажите как это реализовать? #include <cstdlib> #include <iostream> using namespace std; struct node { http://www.cyberforum.ru/cpp-beginners/thread999646.html
Нужно из строки символов удалить символы которые встречаются в нем только один раз C++
Помогите пожалуйста! Очень нужно.
C++ Составить программу выбирающего из введенного массива чисел, все, числа кратные 10
Составить программу выбирающего из введенного массива чисел, все, числа кратные 10
C++ "Олимпиадная задачка" http://www.cyberforum.ru/cpp-beginners/thread999630.html
Напишите программу, которая в последовательности натуральных чисел определяет минимальное число, оканчивающееся на 4. Программа получает на вход количество чисел в последовательности, а затем сами числа. В последовательности всегда имеется число, оканчивающееся на 4. Количество чисел не превышает 1000. Введённые числа не превышают 30 000. Программа должна вывести одно число – минимальное...
C++ Упорядочить строки целочисленной Приветствую всех, мне нужно помощь в решении этой задачи, сам не могу поймать баг.. в целом все работает, но на деле выводит не до конца отредактированный массив. Заранее благодарен! Упорядочить строки целочисленной прямоугольной матрицы по возрастанию суммы //модулей их элементов. Найти номер первого из столбцов, содержащих хотя бы один //отрицательный элемент. #include "stdafx.h"... подробнее

Показать сообщение отдельно
Scatten
1 / 1 / 0
Регистрация: 28.04.2013
Сообщений: 55

синхронизация потоков - C++

06.11.2013, 15:40. Просмотров 157. Ответов 0
Метки (Все метки)

Добрый день.
Не могу никак врубиться как синхронизировать с помощью семафоров потоки.
Требуется проверить по порядку элементы массива. Первый поток проверяет только чётные, второй только нечётные. Третий поток считывает из разделяемой переменной значение и если 1, то увеличивает другую разделяемую переменную и завершает работу после повторного значения 1 первой разделяемой переменной. После завершения всех дочерних потоков, основной выводит на экран значение второй разделяемой переменной.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
HANDLE S1, S2, S3;
int  n;
int *a;
int b = 0;
int c = 0;
 
using namespace std;
 
DWORD WINAPI ThreadFunc1(LPVOID) {
  double temp = 1;
  for (int i = 0; i < 2*n; i += 2) {
    WaitForSingleObject(S1, INFINITE);
    cout << "even checked " << a[i] << endl;;
    b = 1;
    WaitForSingleObject(S3, INFINITE);
    ReleaseSemaphore(S1, 1, 0); }
  return 0;
}
 
DWORD WINAPI ThreadFunc2(LPVOID) {
  double temp = 1;
  for (int i = 1; i < 2*n; i += 2) {
    WaitForSingleObject(S2, INFINITE);
    cout << "odd checked " << a[i] << endl;
    b = 1;
    WaitForSingleObject(S3, INFINITE);
    ReleaseSemaphore(S2, 1, 0); }
  return 0;
}
 
DWORD WINAPI ThreadFunc3(LPVOID) {
  int temp = b;
  WaitForSingleObject(S1, INFINITE);
  WaitForSingleObject(S2, INFINITE);
  if (temp == 1) c++;
  cout << "\nc= " << c;
  ReleaseSemaphore(S3, 1, 0);
  return 0;
}
 
int main()
{
    cout << "Type 'n' ";
    cin >> n;
    a = new int [2*n];
    cout << endl;
    srand(time(NULL));
    for(int i = 0; i < 2*n; i++) {
    a[i] = 2 + rand() % 98; a[i] *= a[i];
    cout << i + 1 << ". " << a[i] << endl; }  
    
S1 = CreateSemaphore(0, 1, INFINITE, 0);
S2 = CreateSemaphore(0, 1, INFINITE, 0);
S3 = CreateSemaphore(0, 1, 2, 0);
HANDLE Thread1 = CreateThread(0, 0, ThreadFunc1, 0, 0, 0);
if (Thread1 == NULL) cerr << GetLastError() << endl;
HANDLE Thread2 = CreateThread(0, 0, ThreadFunc2, 0, 0, 0);
if (Thread2 == NULL) cerr << GetLastError() << endl;
HANDLE Thread3 = CreateThread(0, 0, ThreadFunc3, 0, 0, 0);
if (Thread3 == NULL) cerr << GetLastError() << endl;
CloseHandle(Thread1); CloseHandle(S1); CloseHandle(S2); CloseHandle(S3); delete[] a;
cout << "\nc = " << c;
return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru