728x90

SpinLock과 같이 다른 스레드가 해당 작업을 끝낼 때 까지 무한정 대기 하는 것이아니라, 작업이 완료되면 이벤트로 알려줄 테니 그 때 접근해서 사용해라 라는 것을 알려주기 위한 것이 Event이다.

Event는 커널 오브젝트에 속하는데 커널 오브젝트에는 두가지 공통 속성이 있다.

1. Usage Count 몇 명이 사용하는지?

2. Singnal / Non - Signal 사용중인지?

여기서 사용할 Event는 추가적으로 Auto / Manual 속성을 지정할 수 있다.

사용

WINBASEAPI
_Ret_maybenull_
HANDLE
WINAPI
CreateEventW(
    _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes, // 보안속성
    _In_ BOOL bManualReset,                           // Auto(FALSE), Manual(TRUE)
    _In_ BOOL bInitialState,                          // 초기상태
    _In_opt_ LPCWSTR lpName                           // 이름 설정
    );

#define CreateEvent  CreateEventW
 

windows.h 헤더를 추가하고 CreateEvent를 사용하면 이벤트 생성이 가능한데 중요한 것은 bManualReset, bInitialState인자이다 TRUE, FALSE 둘 중 하나를 지정해주면 되는데, bManualReset의 경우 TRUE면 ManualReset방식, FALSE면 AutoReset방식으로 설정된다. bInitialState는 초기 상태로 TRUE면 처음 모두 접근 허용이고, FALSE일 경우 한 번은 직접 State를 변경해주어야 접근이 가능하게 되고 HANDLE객체를 return한다.

HANDLE handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);;
::SetEvent(handle);
::WaitForSingleObject(handle, INFINITE);
 

SetEvent함수는 Event를 접근 가능한 상태로 바꿔주는 함수이고, WaitForSingleObject는 얼마나 대기할지 정해주는 함수이다. SetEvent함수는 특정 작업이 끝났을 때 호출해서 사용하면 될 것이고, WaitForSingleObject는 대기가 길어질 것 같은 함수에서 사용하면 되겠다.

 

728x90

'C++ > 멀티스레드' 카테고리의 다른 글

future  (1) 2023.05.14
Condition Variable  (1) 2023.05.14
SpinLock  (0) 2023.05.14
DeadLock  (0) 2023.05.14
Lock  (0) 2023.05.12

+ Recent posts