Lab3
.docxЛабораторная работа № 3
Студента ИТ 14-1 Красовского Абхая
Базовые механизмы взаимодействия потоков: события и семафоры
Вариант №9
Цель: Получить навыки в следующих предметных областях:
-
создание и использование событий потоками;
-
создание и использование семафоров потоками;
-
особенности освобождения и использования функций ожидания на этих диспетчерских объектах.
Индивидуальное задание
Реализовать задание, полученное в лабораторной работе 1, создать взаимодействие потоков, событий и семафоров.
Код:
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
using namespace std;
using namespace boost;
HANDLE hEvent, hEvent2, hSem;
void ThreadFunc()
{
//WaitForSingleObject(hSem, INFINITE);
cout << "Функция потока №1" << endl;
cout << "Делаем первое событие сигнальным" << endl;
SetEvent(hEvent);
//ReleaseSemaphore(hSem, 1, NULL);
}
void ThreadFunc2()
{
//WaitForSingleObject(hSem, INFINITE);
WaitForSingleObject(hEvent, INFINITE);
cout << "Ловим сигнал завершения первого потока через первое событие" << endl;
cout << "Функция потока №2" << endl;
CloseHandle(hEvent);
cout << "Закрываем первое событие и делаем второе сигнальным" << endl;
SetEvent(hEvent2);
//ReleaseSemaphore(hSem, 1, NULL);
}
void main()
{
setlocale(LC_ALL, "rus");
cout << "Начало программы, создание событий и потоков!" << endl;
hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
hEvent2 = CreateEvent(NULL, FALSE, FALSE, NULL);
hSem = CreateSemaphore(NULL, 1, 1, NULL);
thread thr(ThreadFunc);
thread thr2(ThreadFunc2);
thr.join();
thr2.join();
WaitForSingleObject(hEvent2, INFINITE);
cout << "Ловим сигнал о завершении второго потока через второе событие" << endl;
cout << "Закрывааем второе событие" << endl;
CloseHandle(hEvent2);
CloseHandle(hSem);
cout << "Заверешение программы!" << endl;
thr.~thread();
thr2.~thread();
_getch();
}
Результат: