Синхронизация потоков средствами POSIX
Автор: KindTed • Август 29, 2019 • Лабораторная работа • 1,498 Слов (6 Страниц) • 362 Просмотры
1. Цель работы
Выбрать граф запуска потоков соответственно варианту задания. Реализовать последовательно-параллельный запуск потоков в ОС Windows с использованием средств синхронизации. Вершины графа – точки запуска/завершения потоков, дуги – потоки.
2. Вариант задания
[pic 1]
рис.2.1
3. Программная реализация
#include
#include
#include
#include
#include
using namespace std;
#define MAX_SEM_COUNT 4
HANDLE semaphore;
DWORD IDThreadID;
DWORD WINAPI ThreadB(LPVOID i);
DWORD WINAPI ThreadC(LPVOID i);
DWORD WINAPI ThreadD(LPVOID i);
DWORD WINAPI ThreadE(LPVOID i);
DWORD WINAPI ThreadF(LPVOID i);
DWORD WINAPI ThreadG(LPVOID i);
DWORD WINAPI ThreadH(LPVOID i);
DWORD WINAPI ThreadI(LPVOID i);
DWORD WINAPI ThreadK(LPVOID i);
DWORD WINAPI ThreadM(LPVOID i);
DWORD WINAPI ThreadA(LPVOID i) {
UNREFERENCED_PARAMETER(i);
WaitForSingleObject(semaphore, INFINITE);
for (int i = 0; i < 4; i++) {
cout << "a";
Sleep(300);
}
ReleaseSemaphore(semaphore, 1, NULL);
// C
HANDLE threadC = CreateThread(NULL, 0, ThreadC, NULL, 0, &IDThreadID);
return TRUE;
}
DWORD WINAPI ThreadB(LPVOID i) {
UNREFERENCED_PARAMETER(i);
WaitForSingleObject(semaphore, INFINITE);
for (int i = 0; i < 8; i++) {
cout << "b";
Sleep(300);
}
ReleaseSemaphore(semaphore, 1, NULL);
//F
HANDLE threadF = CreateThread (NULL, 0, ThreadF, NULL, 0, &IDThreadID);
// H
HANDLE threadH = CreateThread(NULL, 0, ThreadH, NULL, 0, &IDThreadID);
return TRUE;
}
DWORD WINAPI ThreadC(LPVOID i) {
UNREFERENCED_PARAMETER(i);
WaitForSingleObject(semaphore, INFINITE);
for (int i = 0; i < 4; i++) {
cout << "c";
Sleep(300);
}
ReleaseSemaphore(semaphore, 1, NULL);
// E
HANDLE threadE = CreateThread(NULL, 0, ThreadE, NULL, 0, &IDThreadID);
return TRUE;
}
DWORD WINAPI ThreadD(LPVOID i) {
UNREFERENCED_PARAMETER(i);
WaitForSingleObject(semaphore, INFINITE);
...