첫 인수가 스레드 핸들일 경우,
스레드가 종료하거나 두번째 인수인 time-out 시간에 도달하면 리턴하게 된다.
그런데 조금 유의할 게 둘이상의 스레드가 대기하는 경우...
타겟 스레드 종료시점이나 타임아웃 시점에 대기순서대로의 실행을 보장해주지 못한다.
이를 테면
WaitForSingleObject(h타겟스레드, 타임아웃);
이런 대기코드가 존재하고
대기 스레드 1이 먼저 대기상태에 들어가고
이후 대기 스레드 2가 대기상태에 들어가고
조금 있다가 대기 스레드 3이 대기상태에 들어간 후
타겟 스레드가 실행이 종료되면 대기상태에 가장 먼저 들어간 스레드 1이 먼저 실행되진 않는다.
대기 스레드 1, 대기 스레드 2, 대기 스레드 3 이런 순으로 항상 실행되지 않는다.
여러 번 테스트해 봤는데 거의 무작위 결과다.
곰곰이 생각해 보니 OS 커널에 의해 스레드 모두 대기상태에 있다가
타겟 스레드가 종료되면 대기 스레드들이 대기 상태에서 깨어나게 되고(진행가능한 상태) 이제 컨텍스트 스위칭에 의해
가장 먼저 점유를 갖게 되는 대기 스레드가 실행되는 것이다.
순서를 보장받고 싶으면 전후로 크리티컬 섹션이나 뮤텍스 등 동기화 관련 코딩을 해줘야 한다.
WaitForeSingleObject(h뮤텍스, 8초);
WaitForSingleObject(h타겟스레드, 7초);
ReleaseMutex(h뮤텍스);
위와 같은 코드가 될 것이다.
테스트해봤는데 대기하는 순서를 잘 보장해줬다.
타임아웃 시간은 INFINITE(무한대기)로 설정하지 않는 경우
당연히 위처럼 뮤텍스 wait 함수에 조금 더 큰 수치를 줘야 될 것이다.
'API' 카테고리의 다른 글
프로세스 경로 구할 때 OpenProcess flag 팁 (0) | 2012.10.19 |
---|---|
비정상적인 explorer 다운 상황 후 발생하는 메시지 및 트레이 아이콘 되살리기 (0) | 2012.10.16 |
비주얼 스튜디오 리소스 편집기에서 에디트 박스 높이가 줄어들지 않을 때 팁 (0) | 2012.03.22 |
뮤텍스와 세마포어,,, WAIT_ABANDONED 발생 여부 (0) | 2012.03.06 |
프로세스, 스레드간의 상호 통신에 주의해야 될 점 (0) | 2011.07.21 |
SetCapture 특기할만한 사항 (0) | 2011.07.16 |
SetROP2 이용하여 반전효과 사용시 주의사항 (0) | 2011.07.12 |