이벤트기반 동기화
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로 호출하는 것이다.
'Programming > Win_API' 카테고리의 다른 글
API Hooking 정리 (0) | 2013.11.10 |
---|---|
쓰레드 - 타이머기반 동기화 (0) | 2013.01.03 |
IPC - 메일 슬롯 (1) | 2012.12.26 |
윈도우즈 API - 데이터 타입(reference) (0) | 2012.09.13 |
윈도우즈 API - 메모리 관련 함수2 (GetProcessHeap, HeapAlloc, HeapFree, HeapCreate) (0) | 2012.09.11 |