뮤텍스 - 이벤트 사용 기본코드
DWORD _tmain(int argc, LPTSTR argv[])
{
HANDLE hProduce, hConsume;
mBlock.mGuard = CreateMutex(NULL, FALSE, NULL);
// 두번째 인자가 TRUE 이면 생성 즉시 뮤텍스 할당
mBlock.mReady = CreateEvent(NULL, FALSE, FALSE, NULL);
//mBlock.mReady = CreateEvent(NULL, TRUE, FALSE, NULL);
// 두번째 인자 ManualReset 가 TRUE 이면 수동 재설정 이벤트(All Thread Signaled)-셋이벤트 후 계속 signaled 상태로 남음. FALSE 이면 자동으로 ResetEvent.
// 세번째 인자 InitialState 가 TRUE이면 Singaled 상태로 생성.
hProduce = (HANDLE) _beginthreadex(NULL, 0, Produce, NULL, 0, NULL);
hConsume = (HANDLE) _beginthreadex(NULL, 0, Consume, NULL, 0, NULL);
WaitForSingleObject(hProduce, INFINITE);
WaitForSingleObject(hConsume, INFINITE);
...
}
UINT WINAPI Produce (void *arg)
{
while(!mBlock.fStop)
{
Sleep(rand()/5);
WaitForSingleObject(mBlock.mGuard, INFINITE);
__try{
if(!mBlock.fStop){
mBlock.fReady=0;
MessageFill(&mBlock);
mBlock.fReady=1;
InterlockedIncrement(&mBlock.mSeq);
SetEvent(mBlock.mReady);
//PulseEvent(mBlock.mReady);
}
}
__finally { ReleaseMutex(mBlock.mGuard); }
}
return 0;
}
UINT WINAPI Consume (void *argv)
{
DWORD Shutdown = 0;
CHAR command[10];
while(!Shutdown) {
_tprintf(_T("\n**Enter 'c' for Consume; 's' to stop : "));
_tscanf(_T("%s"), command);
if(command[0] == 's') {
WaitForSingleObject(mBlock.mGuard, INFINITE);
Shutdown = mBlock.fStop = 1;
ReleaseMutex(mBlock.mGuard);
}
else if(command[0] == 'c')
{
WaitForSingleObject(mBlock.mReady, INFINITE);
WaitForSingleObject(mBlock.mGuard, INFINITE);
__try{
if(!mBlock.fReady) __leave;
MessageDisplay(&mBlock);
InterlockedIncrement(&mBlock.nCons);
mBlock.nLost = mBlock.mSeq - mBlock.nCons ;
mBlock.fReady = 0;
}
__finally {
ReleaseMutex( mBlock.mGuard );
// Ready 를 해제 안해도 되는 것은 CreateEvent / SetEvent 속성
}
}
else
{
_tprintf(_T("Illegal command. Try again.\n"));
}
}
return 0;
}
'Research > Source Repository' 카테고리의 다른 글
| Variadic 매크로 (0) | 2014.06.16 |
|---|---|
| ThreadPool simple example (0) | 2013.11.03 |
| simple critical section (0) | 2013.10.09 |
| [Source] Timep.c (0) | 2013.07.10 |
| Windows System Programming (0) | 2013.07.10 |