※ 아래는 윤성우 뇌를 자극하는 윈도우즈 프로그래밍 한빛미디어(주) 2022년
Chapter14(p.453 ~ 474)를 읽고 정리한 내용입니다.
맛있는 빵을 구워내는 생산자가 있다.
이 생산자는 빵을 구워서 테이블 위에 올려 놓는다.
그러면 값을 지불한 소비자들은 테이블에 올려진 빵을 먹게 된다.
순서가 바뀌어 버린다면 소비자는 빈 테이블에서 빵을 찾게 될 것이고,
소비자가 빈 테이블임을 알고 떠난 뒤에야 생산자가 빵을 가져다 놓게 될 것이다.
-> 순서가 중요하다.
(1) 이벤트(이벤트 오브젝트) 생성
HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes, // 보안 속성 지정
BOOL bManualReset, // 수동리셋모드(TRUE), 자동리셋모드(FALSE) 지정
BOOL bInitialState, // 이벤트 오브젝트의 초기 상태 결정
// TRUE -> Signaled, FALSE -> Non-Signaled
LPCTSTR lpName); // 이벤트 오브젝트 이름 결정
(2) 수동리셋모드의 경우 Non-Signaled 상태로 변경(ResetEvent 함수 호출)
BOOL ResetEvent(HANDLE hEvent); // 이벤트 오브젝트의 핸들을 인자로 전달
// 전달된 핸들의 오브젝트는 Non-Signaled가 됨
BOOL SetEvent(HANDLE hEvent); // 이벤트 오브젝트의 핸들을 인자로 전달
// 전달된 핸들의 오브젝트는 Signaled가 됨
(3) 이벤트(이벤트 오브젝트) 소멸
다른 커널 오브젝트와 마찬가지로 CloseHandle 함수를 사용하면 된다.
(참고) 소비자가 2개 이상이여서 실행 순서 동기화와 임계 영역 접근 동기화가 모두 필요한 경우,
이벤트 더하기 뮤텍스 이런식으로 2가지 이상의 동기화 기법을 조합해서 사용하면 된다.
정해진 시간이 지나면 자동으로 Signaled가 되는 특성을 지닌다. (Waitable Timer)
| 타이머 종류 | 설명 |
|---|---|
| 수동 리셋 타이머 | 가장 일반적인 타이머 (알람을 새벽 6시로 맞춰 놓으면 새벽 6시에 울림) |
| 주기적 타이머 | 수동 리셋 타이머에 주기적인 특성이 가해진 형태 (새벽 6시에 울리고, 30분 마다 추가로 울리게 알람 설정) |
(1) 매크로 선언
CreateWaitableTimer와 SetWaitableTimer는
Windows 서버 버전을 기준으로 NT 4.0 이후부터 제공되기 시작한 함수이다.
-> 헤더파일 선언 이전에 매크로 선언을 해주어야한다.
#define _WIN32_WINNT 0x0400
// 아래의 프로그램은 Windows NT 이상에서 실행하겠습니다.
// 그러니 SetWaitableTimer 함수의 호출을 허용해주세요.
(2) 타이머 오브젝트 생성
타이머 오브젝트는 무조건 Non-Signaled 상태로 생성된다.
HANDLE CreateWaitableTimer(LPSECURITY_ATTRIBUTES lpTimerAttributes, // 보안 속성
BOOL bManualReset, // 수동(TRUE), 자동(FALSE)
LPCTSTR lpTimerName); // 타이머 오브젝트 이름 설정
(3) 알람 시간 설정
BOOL SetWaitableTimer(HANDLE hTimer, // 알람을 설정할 타이머 오브젝트 핸들
const LARGE_INTEGER* pDueTime, // *알람이 울리는 시간
LONG lPeriod, // 0이 아닌값 -> 주기적 알람 사용 (Milliseconds)
PTIMERAPCROUTINE pfnCompletionRoutine,
LPVOID lpArgToCompletionRoutine, // 4, 5번째 매개변수는 19장에서 다룸
BOOL fResume); // 기본적으로 FALSE 전달