728x90
Event + Mutex
- 수동 리셋 모드로 두 개 이상의 쓰레드를 실행할 때 하나의 콘솔 메모리 영역에 출력하기 때문에 임계영역으로 처리를 해야 함
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <process.h>
TCHAR string[100];
HANDLE hEvent;
HANDLE hMutex;
unsigned int WINAPI OutputThreadFunction(LPVOID lpParam)
{
WaitForSingleObject(hEvent, INFINITE); // 이벤트 상태가 Signaled 상태가 되기를 기다림
WaitForSingleObject(hMutex, INFINITE);
_fputts(_T("Output String : "), stdout);
_fputts(string, stdout);
ReleaseMutex(hMutex);
return 0;
}
unsigned int WINAPI CountThreadFunction(LPVOID lpParam)
{
WaitForSingleObject(hEvent, INFINITE); // 이벤트 상태가 Signaled 상태가 되기를 기다림
WaitForSingleObject(hMutex, INFINITE);
_tprintf(_T("Output String length : %d \n"), (_tcslen(string) - 1));
ReleaseMutex(hMutex);
return 0;
}
int _tmain(int argc, TCHAR* argv[])
{
HANDLE hThread[2];
DWORD dwThreadID[2];
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
hMutex = CreateMutex(NULL, FALSE, NULL);
if (hEvent == NULL || hMutex == NULL)
{
_fputts(_T("Event or Mutex createion error\n"), stdout);
return -1;
}
hThread[0] = (HANDLE)_beginthreadex(NULL, 0, OutputThreadFunction, NULL, 0, (unsigned*)& dwThreadID[0]);
hThread[1] = (HANDLE)_beginthreadex(NULL, 0, CountThreadFunction, NULL, 0, (unsigned*)& dwThreadID[1]);
if (hThread[0] == NULL || hThread[1] == NULL)
{
_fputts(_T("thread createion error\n"), stdout);
return -1;
}
_fputts(_T("Insert String : "), stdout);
_fgetts(string, 30, stdin);
SetEvent(hEvent); // 이벤트 오브젝트 상태를 Signaled 상태로 변경
WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
CloseHandle(hEvent);
CloseHandle(hMutex);
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
return 0;
}
728x90
'Programming > System Programming' 카테고리의 다른 글
윈도우즈 시스템 프로그래밍 - 15. 쓰레드 풀링(1) (0) | 2020.08.09 |
---|---|
윈도우즈 시스템 프로그래밍 - 14. 쓰레드 동기화 기법2(3) (0) | 2020.08.09 |
윈도우즈 시스템 프로그래밍 - 14. 쓰레드 동기화 기법2(1) (0) | 2020.08.09 |
윈도우즈 시스템 프로그래밍 - 13. 쓰레드 동기화 기법1(4) (0) | 2020.08.05 |
윈도우즈 시스템 프로그래밍 - 13. 쓰레드 동기화 기법1(3) (0) | 2020.08.04 |