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

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

Восстановить пароль Регистрация
 
Scatten
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 50
06.11.2013, 15:40     синхронизация потоков #1
Добрый день.
Не могу никак врубиться как синхронизировать с помощью семафоров потоки.
Требуется проверить по порядку элементы массива. Первый поток проверяет только чётные, второй только нечётные. Третий поток считывает из разделяемой переменной значение и если 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2013, 15:40     синхронизация потоков
Посмотрите здесь:

C++ Синхронизация
C++ Синхронизация потоков средствами WinAPI.
C++ Синхронизация потоков, события, WinAPI
C++ Синхронизация потоков в c++
C++ Создание и завершение процессов и потоков. Приоритеты выполнения потоков
Синхронизация потоков на семафорах C++
C++ Буферы и синхронизация потоков
Синхронизация потоков - уведомление о событии C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 00:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru