API

WaitForSingleObject의 첫 인수가 스레드 핸들인 경우 유의점

디버그정 2012. 3. 17. 08:47

첫 인수가 스레드 핸들일 경우,
스레드가 종료하거나 두번째 인수인 time-out  시간에 도달하면 리턴하게 된다.
그런데 조금 유의할 게 둘이상의 스레드가 대기하는 경우...
타겟 스레드 종료시점이나 타임아웃 시점에 대기순서대로의 실행을 보장해주지 못한다.

이를 테면

WaitForSingleObject(h타겟스레드, 타임아웃);
이런 대기코드가 존재하고

대기 스레드 1이 먼저 대기상태에 들어가고
이후 대기 스레드 2가 대기상태에 들어가고
조금 있다가 대기 스레드 3이 대기상태에 들어간 후
   
타겟 스레드가 실행이 종료되면 대기상태에 가장 먼저 들어간 스레드 1이 먼저 실행되진 않는다.
대기 스레드 1, 대기 스레드 2, 대기 스레드 3 이런 순으로 항상 실행되지 않는다.
여러 번 테스트해 봤는데 거의 무작위 결과다.

곰곰이 생각해 보니 OS 커널에 의해 스레드 모두 대기상태에 있다가
타겟 스레드가 종료되면 대기 스레드들이 대기 상태에서 깨어나게 되고(진행가능한 상태) 이제 컨텍스트 스위칭에 의해
가장 먼저 점유를 갖게 되는 대기 스레드가 실행되는 것이다.

순서를 보장받고 싶으면 전후로  크리티컬 섹션이나 뮤텍스 등 동기화 관련 코딩을 해줘야 한다.

WaitForeSingleObject(h뮤텍스, 8초);

WaitForSingleObject(h타겟스레드, 7초);

ReleaseMutex(h뮤텍스);
 
위와 같은 코드가 될 것이다.
테스트해봤는데 대기하는 순서를 잘 보장해줬다.
타임아웃 시간은 INFINITE(무한대기)로 설정하지 않는 경우
당연히 위처럼 뮤텍스 wait 함수에 조금 더 큰 수치를 줘야 될 것이다.