본문 바로가기

Research/Source Repository

Mutex - Event Simple Code

뮤텍스 - 이벤트 사용 기본코드


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