운영체제/[ecourse] Windows Programming
6-2-1. Semaphore 실습
헛둘이
2022. 9. 20. 14:04
배운 이론을 실습하는 과정
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <Windows.h>
#include <process.h>
#include <tchar.h>
using namespace std;
HANDLE hSemaphore = INVALID_HANDLE_VALUE;
int totalCount = 0;
UINT threadProc(void* p)
{
totalCount++;
int count = totalCount;
WaitForSingleObject(hSemaphore, INFINITE);
printf("Start Routine %d!\n", count);
Sleep(3000);
printf("End Routine %d!\n", count);
ReleaseSemaphore(hSemaphore, 1, NULL);
return 0;
}
int main()
{
hSemaphore = CreateSemaphoreEx(0, 3, 3, L"Sema1", 0, SEMAPHORE_ALL_ACCESS);
vector<HANDLE> vH;
for (int i = 0; i < 5; i++)
{
vH.push_back(
(HANDLE)_beginthreadex(0, 0, threadProc, 0, 0, 0)
);
}
WaitForMultipleObjects(5, vH.data(), TRUE, INFINITE);
for (HANDLE h : vH)
CloseHandle(h);
CloseHandle(hSemaphore);
return 0;
}
- 실제로 여러 쓰레드로 동시에 작업했을 때, 생각한 대로 작동하는지 연습해보았다.
- 세마포어를 만들고 카운트 3개, 리밋 3개를 걸어두었다.
- 핸들을 동적 배열 vector에 담고 쓰레드를 5개를 만들어서 돌린다.
- 생각대로라면 쓰레드 함수에선 3초동안 Sleep하므로 3개가 먼저 실행되고 3초 후 나머지 2개가 실행되어야 한다.