뮤텍스 - 이벤트 사용 기본코드
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 |