Windows 프로그래밍에서 이벤트를 생성하고 다루는 함수인 CreateEvent, SetEvent, ResetEvent 와 이벤트 대기 함수인 WaitForSingleObject 를 사용해서 스레드 간 통신 또는 동기화를 수행할 수 있다.
CreateEvent()
CreateEvent 함수는 이벤트 객체를 생성한다. 이벤트 객체는 signaled, non-signaled 상태가 있는데 SetEvent 함수를 통해 이벤트 신호를 보내거나 WaitForSingleObject 함수를 통해 이벤트 신호를 받을 수 있다.
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPCTSTR lpName
);
- lpEventAttributes: 보안 속성 설정을 위한 포인터인데 보안 설정을 하지 않을 경우 보통 NULL로 설정한다.
- bManualReset: 수동 리셋 모드 여부, TRUE 또는 FALSE
- TRUE: WaitForSingleObject 함수로 대기 중인 스레드가 시그널을 받으면 이벤트 객체는 자동으로 논시그널 상태로 변하지 않기 때문에 수동으로 ResetEvent를 호출하여 이벤트 객체를 논시그널 상태로 설정해야 한다.
- FALSE: WaitForSingleObject 함수로 대기 중인 스레드가 시그널을 받으면 이벤트 객체는 자동으로 논시그널 상태로 변하기 때문에, 이 모드에서는 ResetEvent 함수를 호출할 필요가 없다.
- bInitialState: 초기 상태 설정 여부. TRUE 또는 FALSE, TRUE 시 초기상태가 signalled이고 FALSE이면 non-signalled이다.
- lpName: 이벤트 객체의 이름인데 이름을 사용하지 않을 경우 보통 NULL로 설정한다.
SetEvent()
이벤트 객체를 시그널 상태로 설정한다. 다른 스레드에서 대기하고 있는 경우 해당 이벤트 객체를 신호로 받게 된다.
BOOL SetEvent(
HANDLE hEvent
);
ResetEvent()
이벤트 객체를 논시그널 상태로 설정한다.
BOOL ResetEvent(
HANDLE hEvent
);
사용 예시.
#include <Windows.h>
#include <iostream>
int main() {
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (hEvent == NULL) {
std::cerr << "Failed to create event." << std::endl;
return 1;
}
// 이벤트를 시그널 상태로 설정
SetEvent(hEvent);
// 이벤트 핸들이 시그널 상태가 될 때까지 대기
DWORD result = WaitForSingleObject(hEvent, INFINITE);
if (result == WAIT_OBJECT_0) {
std::cout << "Event occurred." << std::endl;
}
else {
std::cout << "Wait failed." << std::endl;
}
CloseHandle(hEvent);
return 0;
}
'프로그래밍 > C' 카테고리의 다른 글
C/C++ ] ANSI 이스케이프 코드 시퀀스 사용해서 커서 이동 + 터미널 조작하기 (0) | 2023.12.11 |
---|---|
윈도우 소켓 ] select 입출력 모델 (0) | 2023.11.26 |
윈도우 소켓 ] 소켓과 연결된 원격 호스트의 IP주소와 Port번호 가져오기, getpeername() (0) | 2023.10.28 |
Win32 API ] waitForSingleObject, waitForMultipleObjects (0) | 2023.10.14 |
고해상도 타이머 QueryPerformanceFrequency, QueryPerformanceCounter (0) | 2023.10.09 |