Advertisement
AlukardBF

os_laba2_yar

Mar 12th, 2017
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <windows.h>
  2. #include <process.h>
  3. #include <ctime>
  4. #include <cstdio>
  5. #include <iostream>
  6. #include <conio.h>
  7.  
  8. //Заголовок mutex'а
  9. HANDLE hMutex;
  10. //Сумма ряда, DWORD64 == unsigned long long
  11. DWORD64 sum = 0;
  12. //Флаг выхода
  13. bool isExit = false;
  14.  
  15. //Поток управления (thread1) потоком счета суммы ряда (thread2)
  16. //Во время работы, каждые 200мс включает/выключает выполнение 2 потока
  17. DWORD32 WINAPI thread1(void*)
  18. {
  19.     //Пока не установлен флаг на выход из программы
  20.     while (!isExit)
  21.     {
  22.         //Используем мьютекс для блокировки второго потока
  23.         WaitForSingleObject(hMutex, 0);
  24.         //Засыпаем на 200мс
  25.         Sleep(200);
  26.         //Выходим из мьютекса
  27.         ReleaseMutex(hMutex);
  28.     }
  29.     //Безопасно закрываем поток
  30.     return 0;
  31. }
  32.  
  33. DWORD32 WINAPI thread2(void*)
  34. {
  35.     //Пока не установлен флаг на выход из программы
  36.     while (!isExit)
  37.     {
  38.         //Если мьютекс свободен, тут же освобождаем его.
  39.         //Если занят, ждем пока не освободится
  40.         if(WaitForSingleObject(hMutex, INFINITE) == WAIT_OBJECT_0)
  41.             ReleaseMutex(hMutex);
  42.         //Считаем сумму ряда, выводим на экран
  43.         sum += rand() % 10;
  44.         std::cout << sum << std::endl;
  45.     }
  46.     //Безопасно закрываем поток
  47.     return 0;
  48. }
  49.  
  50. int main(int argc, char* argv[])
  51. {
  52.     SetConsoleOutputCP(1251);
  53.     srand(time(NULL));
  54.     //Массив для хранения заголовков потоков
  55.     //Обязателен именно массив для работы функции WaitForMultipleObject
  56.     HANDLE hThread[2];
  57.     //Создаем mutex
  58.     hMutex = CreateMutex(NULL, FALSE, NULL);
  59.     //Создаем оба потока. Создаем их изначально на паузе.
  60.     //Для этого задаем свойство CREATE_SUSPEND
  61.     hThread[0] = (HANDLE)_beginthreadex(NULL, 0, thread1, NULL, CREATE_SUSPENDED, NULL);
  62.     hThread[1] = (HANDLE)_beginthreadex(NULL, 0, thread2, NULL, CREATE_SUSPENDED, NULL);
  63.     //Ожидаем нажатия любой клавиши для старта программы
  64.     _getch();
  65.     //Размораживаем второй (считающий) поток
  66.     ResumeThread(hThread[1]);
  67.     //До тех пор, пока пользователь не нажал '0'
  68.     //Что означает выход из программы
  69.     while (_getch() != '0')
  70.     {
  71.         //Команды воплняются только после нажатия любой клавиши
  72.         //Так как выполнение приостанавливает _getch()
  73.  
  74.         //Размораживаем первый (управляющий) поток
  75.         ResumeThread(hThread[0]);
  76.         //На время от 300мс до 2000мс
  77.         Sleep(rand() % 1700 + 300);
  78.         //Замораживаем его обратно
  79.         SuspendThread(hThread[0]);
  80.     }
  81.     //Выходим из программы, закрываем потоки
  82.     //Ставим флаг выхода для потоков
  83.     isExit = true;
  84.     //Размораживаем первый (управляющий) поток, чтобы он сам мог закрыться
  85.     ResumeThread(hThread[0]);
  86.     //Функция WaitForMultipleObject в данном виде
  87.     //Ожидает пока не закроются все потоки
  88.     //заголовки которых находятся в hThread
  89.     WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
  90.     //Пауза
  91.     system("pause");
  92.     //Выходим
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement