CreateEvent 분석...(펌)

2015. 8. 11. 18:12IT-개발/winapi 및 MFC

반응형

오랫만에 사용해서 햇갈리는 거였나....ㅠㅠ...


아래 글을 참조하고 나서나 결국 소스가 어떻게 동작하는지 이해했다.


CreateEvent() 분석

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....

결론.. 코드가 복잡해지므로, 그냥 두번째 인자는 FALSE, 세번째 인자도 FALSE 주고 하자, 일관성이 있게 코딩하는게 더 좋을듯하다.


=================================================


위에서 Box 처리되어 잇는 부분 처럼 CreateEvent를 2번째인자: FALSE, 3번째인자: TRUE 로 생성해봤나? ..ㅠㅠ... 이렇게 


만들이유가 있을까 ... 한번도 생각해본적 없는데... 이렇게 만든 코드 오늘보고 ...... 아~~ 황당


non-signal 상태로 만들어주는걸 WaitForSingleObject 함수가 해주다 보니~ 뒤에 따라오던 Thread들 여기에 걸림.


나중에 먼저 지나간 Thread가 SetEvent 해주면, 걸려있떤 Thread들 동작~


ㅠㅠ.. 한마디로 먼저도착한 넘이 지뢰 같은거 심어서 곧바로 도착한 녀석 못 움직이게 잡아놓고, 자기가 SetEvent해주면


잡혀있던애가 풀려나는 방식임~ 공유자원을 딴 녀석들이 못쓰도록하기 위해 누가 이허게 해뒀던데~~ 과연 좋은 방법인지는


모르긋다~...