Cirtical Section(임계 영역) - CreateEvent
이번에는 CreateEvent로 동기화하는 방식이다. CreateEvent는 좋은 예제가 생각이 나지 않아 그냥 틀만 만들어 보았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include<stdio.h> #include<Windows.h> #include<process.h> HANDLE hEvent; unsigned int WINAPI Thread1(LPVOID lpParam) { WaitForSingleObject(hEvent, INFINITE); //작업 return 0; } int main() { HANDLE hThread; DWORD dwThreadID; hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (hEvent == NULL) { printf_s("hEvent Func err : %d\n", GetLastError()); return -1; } hThread = (HANDLE)_beginthreadex(NULL, 0, Thread1, NULL, 0, (unsigned*)&dwThreadID); if (hThread == NULL) { printf_s("_beginthreadex Func err : %d\n", GetLastError()); return -1; } SetEvent(hEvent); WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); CloseHandle(hEvent); return 0; } | cs |
예제를 보면 18번째 줄에서 이벤트를 생성한다. 그리고 쓰레드를 생성하는데 시작하자마자 WaitForSingleObject를 만나 non-signaled가 되어 대기한다. SetEvent가 실행되며 이벤트가 signaled 되어 쓰레드가 실행되 작업을 하고 main에서는 쓰레드가 끝나기를 기달린다.
HANDLE WINAPI CreateEvent( _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes, _In_ BOOL bManualReset, _In_ BOOL bInitialState, _In_opt_ LPCTSTR lpName );
첫번째 파라미터는 보안 속성이다. 핸들을 자식 프로세스에게 상속할 경우 NULL이 아닌 값으로 설정을 한다. 두번째 파라미터는 Manual-Reset 모드 커널 오브젝트일 경우 TRUE를 Auto-Reset 모드 커널 오브젝트 일 경우 FALSE를 전달한다. 세번째 파라미터는 signaled 상태의 이벤트 오브젝트를 생성하려면 TRUE, non-signaled 상태의 이벤트 오브젝트를 생성하려면 FALSE를 준다. 마지막 파라미터는 이벤트 오브젝트에 이름을 설정한다.
여기서 Manual-Reset 모드 이벤트 오브젝트, Auto-Reset 모드 이벤트 오브젝트가 나오는데 이게 무엇일까??
바로 WaitForSingleObject 함수 호출 후 이벤트 오브젝트 상태에 따라 다른것이다. 함수 호출 후에 signaled 상태가 유지가 되면
Manual-Reset 모드 이벤트 오브젝트이고, non-signaled 상태면 Auto-Reset 모드 이벤트 오브젝트 이다.
Manual-Reset 모드 이벤트 오브젝트는 signaled 상태에서 non-signaled 상태로 바꾸기 위한 함수를 호출해야하는데 그건 바로 ResetEvent 이다.
BOOL WINAPI ResetEvent( _In_ HANDLE hEvent );
Auto-Reset 모드 이벤트 오브젝트는 WaitForSingleObject 로 signaled 상태에서 non-signaled 상태로 변환한다.
그럼 non-signaled 에서 signaled로 바꾸는 함수는 SetEvent 함수이다.
BOOL WINAPI SetEvent( _In_ HANDLE hEvent );
'My Study > System' 카테고리의 다른 글
[windbg]기본 명령어 (0) | 2016.07.29 |
---|---|
[windbg]심볼 파일 로드 (0) | 2016.07.28 |
Critical Section(임계 영역) - Semaphore (0) | 2016.07.06 |
Critical Section(임계 영역) - Mutex (0) | 2016.07.06 |
Critical Section(임계 영역) - Interlocked (0) | 2016.07.05 |