본문 바로가기
Programming/Win_API

쓰레드 - 이벤트기반 동기화

by bbolmin 2013. 1. 3.

 

이벤트기반 동기화

 

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES lpEventAttributes,

BOOL bManualReset, // TRUE : Manual-Reset Mode, FALSE : Auto-Reset Mode

BOOL bInitialState,  // TRUE : Signaled 상태로 생성, FALSE : Non-Signaled 상태로 생성

LPCTSTR lpName

);

 

쓰레드나 프로세스의 커널 오브젝트는 초기(Non-Signaled 상태)에서 종료시에 Signaled 상태로 변경되지만 이벤트 오브젝트의 경우에는 수동으로 함수 호출(SetEvent)을 통해서 해줘야한다.

 

보통 WaitForSingleObject()함수는 Signaled 상태가 된 경우에 반환하면서 자동으로 Non-Signaled 상태로 변경하지만 이벤트 오브젝트는 CreateEvent의 2번째 인자 bManualReset에 따라서 TRUE인 경우에는 자동으로 변경해주며 FALSE인 경우에는 수동으로(ResetEvent) 변경해야한다.

 

 

Manual-Reset Mode

Non-Signaled 상태 ---(SetEvent)--->  Signaled 상태 --(WaitForSingleObject + ResetEvent) ---> Non-Signaled 상태

 

Auto-Reset Mode

Non-Signaled 상태 ---(SetEvent)--->  Signaled 상태 --(WaitForSingleObject) ---> Non-Signaled 상태

 

 

BOOL SetEvent(HANDLE hEvent) : 핸들의 오브젝트를 Signaled 상태로

BOOL ResetEvent(HANDLE hEvent) : 핸들의 오브젝트를 Non-Signaled 상태로

 

 

간단히 사용 예를 보면 아래와 같다.

 

char test[100];

 

A스레드{
WaitForSingleObject()로 이벤트 핸들 대기
printf("%s", test);
}

 

B스레드 {
scanf("%s", test);
SetEvent()로 이벤트 핸들 Signaled로
}

 

(1) B스레드의 scanf로 변수 test에 입력받아서

(2) 순서에 맞게 A스레드의 printf로 호출하는 것이다.