Mutex는 auto-reset 함수. 세마포어도.
WaitForSingleObject 함수 호출이 정상적으로 완료되면 non-signaled 상태로 되돌아감.
3번째 인자가 FALSE 전달시 signal 됨
CreateEvent()..
- 대기 상태에 있는 쓰레드 모두를 실행 가능한 상태로 변경해줄수 있다. 다른건 하나의 쓰레드만 가능하다.
- manual-reset 모드로 Event 생성 가능하다.
2번째 인자가 TRUE 일경우 manual-reset 모드, FALSE 일경우 auto-reset 모드 event 생성.
manual-reset (TRUE)
- Event가 signaled 상태에 있을 경우 ResetEvent() 함수를 호출하지 않으면 non-signaled 상태로 돌아가지 않는다.
- 뮤택스의 경우 WaitForSingleObject 함수호출이 성공적으로 끝나야먄 non-signaled 로 변경됨.
- 실행시켜야할 쓰레드가 둘이상인 경우 유용하게 사용되는 동기화 오브젝트,
auto-reset(뮤택스, 세마포어) (FALSE)
- ResetEvent 함수를 호출하지 않아도 WaitForSingleObject 함수를 호출이 성공하면, 알아서 non-signaled로 변경
3번째 인자가 TRUE 일경우 signaled 상태, FALSE 일경우 Non-signaled 상태 event 생성.
HANDLE h = CreateEvent(0, TRUE, TRUE, 0);
for (int i=0; i<5; i++)
{
WaitForSingleObject(h, INFINITE);
printf("%d ", i);
}
[0 1 2 3 4 ] // 수동 리셋, signal 시작, // 3번째 인자가 TRUE이므로, signaled Wait..() 통과, 이후 수동리셋이기에,non -signaled 변화없음.
....... 아래는 간단 TEST 진행
HANDLE h = CreateEvent(0, TRUE, FALSE, 0);
[출력값 없음] // 수동리셋, non-signal // 3번째 인자가 FALSE 이므로, 통과할수 없음.
HANDLE h = CreateEvent(0, FALSE, FALSE, 0);
[출력값 없음] // 자동리셋,non- signal // 3번째 인자가 FALSE 이므로, 통과할수 없음.
HANDLE h = CreateEvent(0, FALSE, TRUE, 0);
[0 ] // 자동리셋, signal // 3번째 인자가 TRUE이므로, signaled WaitForSingleObject() 통과, 이후 자동리셋이므로 알아서 non-signaled가 되어 WaitForSingleObject....