뮤텍스를 2개생성하고 사용하는 예제
# MutexNoti Example
constexpr auto MAX_THR_CNT 4
DWORD WINAPI ThreadProc(PVOID pParam);
int main()
{
① Mutex를 2개 생성 (종료Mutex, 임계구역설정Mutex)
HANDLE arWaits[2];
arWaits[0] = CreateMutex(nullptr, TRUE, _T("종료Mutex"));
arWaits[1] = CreateMutex(nullptr, FALSE, _T("임계구역Mutex"));
② 작업 스레드를 생성
HANDLE arhThreads[MAX_THR_CNT];
for(auto i=0; i<MAX_THR_CNT; i++)
{
DWORD dwThreadID(0);
arhThreads[i] = CreateThread(nullptr, 0, ThreaProc, arWaits, 0, &dwThreadID);
}
③ 키를 받으면 실행중인 스레드를 종료하기 위해서 소유한 뮤텍스를 해제
getchar();
ReleaseMutex(arWaits[0]);
④ 모든 스레드의 종료(TRUE)를 무한대기(INFINITE).
WaitForMultipleObjects(MAX_THR_CNT, arhThreads, TRUE, INFINITE);
⑤ 모든 스레드를 종료
for (auto i=0; i<MAX_THR_CNT; i++)
{
CloseHandle(arhThreads[i]);
}
for (auto i=0; i<2; i++)
{
CloseHandle(arWaits[1];
}
return 0;
}
* 스레드 엔트리 함수에 대한 구현
DWORD WINAPI ThreadProc(PVOID pParam)
{
PHANDLE parWaits = (PHANDLE)pParam;
while(true)
{
DWORD dwWaitCode = WaitForMultipleObjects(2, parWaits, FALSE, INFINITE);
if(dwWaitCode == WAIT_FAILED)
{
break;
}
if(dwWaitCode == WAIT_OBJECT_0)
{
break;
}
// Do somethings , Critical Region
SYSTEMTIME st;
GetLocalTime(&st);
cout << "..." << "Sub Thread " << GetCurrentThreadId() << " => ";
cout << st.wYear << "/" << st.wMonth << "/" << st.wDay << " ";
cout << st.wHour << ":" << st.wMinute << ":" << st.wSecond << " ";
cout << st.wMilliseconds << endl;
ReleaseMutex(parWaits[1]);
Sleep(1000);
}
return 0;
}
'프로그래밍 > 윈도우시스템' 카테고리의 다른 글
세마포어(Semaphore)에 대한 이해 (0) | 2019.12.04 |
---|---|
뮤텍스에 대한 이해 (Mutex) (0) | 2019.12.04 |
프로세스(Process)와 스레드(Thread)의 개념 (0) | 2019.12.04 |