My Study/System

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(NULL0,
        Thread1, NULL0, (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 );

출처 : CreateEvent MSDN


  첫번째 파라미터는 보안 속성이다. 핸들을 자식 프로세스에게 상속할 경우 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
);

출처 : ResetEvent MSDN


  Auto-Reset 모드 이벤트 오브젝트는 WaitForSingleObject 로 signaled 상태에서 non-signaled 상태로 변환한다. 


  그럼 non-signaled 에서 signaled로 바꾸는 함수는 SetEvent 함수이다.

BOOL WINAPI SetEvent(
  _In_ HANDLE hEvent
);

출처 : SetEvent MSDN


   

최근 트랙백

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.