Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include <process.h>
- #include <ctime>
- #include <cstdio>
- #include <iostream>
- #include <conio.h>
- //Заголовок mutex'а
- HANDLE hMutex;
- //Сумма ряда, DWORD64 == unsigned long long
- DWORD64 sum = 0;
- //Флаг выхода
- bool isExit = false;
- //Поток управления (thread1) потоком счета суммы ряда (thread2)
- //Во время работы, каждые 200мс включает/выключает выполнение 2 потока
- DWORD32 WINAPI thread1(void*)
- {
- //Пока не установлен флаг на выход из программы
- while (!isExit)
- {
- //Используем мьютекс для блокировки второго потока
- WaitForSingleObject(hMutex, 0);
- //Засыпаем на 200мс
- Sleep(200);
- //Выходим из мьютекса
- ReleaseMutex(hMutex);
- }
- //Безопасно закрываем поток
- return 0;
- }
- DWORD32 WINAPI thread2(void*)
- {
- //Пока не установлен флаг на выход из программы
- while (!isExit)
- {
- //Если мьютекс свободен, тут же освобождаем его.
- //Если занят, ждем пока не освободится
- if(WaitForSingleObject(hMutex, INFINITE) == WAIT_OBJECT_0)
- ReleaseMutex(hMutex);
- //Считаем сумму ряда, выводим на экран
- sum += rand() % 10;
- std::cout << sum << std::endl;
- }
- //Безопасно закрываем поток
- return 0;
- }
- int main(int argc, char* argv[])
- {
- SetConsoleOutputCP(1251);
- srand(time(NULL));
- //Массив для хранения заголовков потоков
- //Обязателен именно массив для работы функции WaitForMultipleObject
- HANDLE hThread[2];
- //Создаем mutex
- hMutex = CreateMutex(NULL, FALSE, NULL);
- //Создаем оба потока. Создаем их изначально на паузе.
- //Для этого задаем свойство CREATE_SUSPEND
- hThread[0] = (HANDLE)_beginthreadex(NULL, 0, thread1, NULL, CREATE_SUSPENDED, NULL);
- hThread[1] = (HANDLE)_beginthreadex(NULL, 0, thread2, NULL, CREATE_SUSPENDED, NULL);
- //Ожидаем нажатия любой клавиши для старта программы
- _getch();
- //Размораживаем второй (считающий) поток
- ResumeThread(hThread[1]);
- //До тех пор, пока пользователь не нажал '0'
- //Что означает выход из программы
- while (_getch() != '0')
- {
- //Команды воплняются только после нажатия любой клавиши
- //Так как выполнение приостанавливает _getch()
- //Размораживаем первый (управляющий) поток
- ResumeThread(hThread[0]);
- //На время от 300мс до 2000мс
- Sleep(rand() % 1700 + 300);
- //Замораживаем его обратно
- SuspendThread(hThread[0]);
- }
- //Выходим из программы, закрываем потоки
- //Ставим флаг выхода для потоков
- isExit = true;
- //Размораживаем первый (управляющий) поток, чтобы он сам мог закрыться
- ResumeThread(hThread[0]);
- //Функция WaitForMultipleObject в данном виде
- //Ожидает пока не закроются все потоки
- //заголовки которых находятся в hThread
- WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
- //Пауза
- system("pause");
- //Выходим
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement