2008. 9. 18. 16:49

포기된 뮤텍스 (Abandoned Mutex & WAIT_ABANDONED)

한 쓰레드가 뮤텍스를 소유하면 이 뮤텍스를 기다리는 스레드들은 모두 블록 상태가 된다. 그런데 만약 뮤텍스를 소유한 스레드가 어떠한 이유로 뮤텍스의 소유를 풀지 못하게 되면 어떻게 될까? 구조적 예외가 발생한 경우나 아니면 Exit Thread 로 스레드를 종료했거나 외부에서 TerminateThread로 스레드를 강제로 죽였을 경우 이런 현상이 발생할 수 있다. 크리티컬 섹션의 경우라면 블록된 스레드를 깨울 수 있는 방법이 없지만 뮤텍스의 경우는 한 가지 안전 장치가 있다.

뮤텍스는 자신을 소유한 스레드가 누구인지를 기억하고 있는데 시스템은 뮤텍스의 소유 스레드가 뮤텍스를 풀지않고 종료되었을 경우 강제로 뮤텍스를 신호상태로 만들어 준다. 이때의 뮤텍스를 포기된 뮤텍스(Abandoned Mutex)라고 한다. 뮤텍스가 포기되면 대기중인 스레드중 하나가 뮤텍스를 가지게 될 것이다. 이 때 이 스레드는 Wait 계열 함수(WaitForSingleObject, WaitForMultipleObjects 등)의 리턴값으로 WAIT_ABANDONED 값을 전달받음으로써 이 뮤텍스가 정상적인 방법으로 신호상태가 된 것이 아니라 포기된 것임을 알 수 있다.

포기된 뮤텍스를 받았다는 것은 스레드 코드에 뭔가 버그가 있다는 뜻이다. 관련 스레드가 정상 종료하지 못했음을 알 수 있는데 이때 뮤텍스에 의해 보고되는 공유 자원의 상태는 알 수가 없다. 이런 상태로 인해 포기된 뮤텍스를 받은 스레드가 정상적으로 동작할 수 없다면 일종의 예외 처리를 해 주어야 하되 실행에 별 이상이 없다면 그냥 실행해도 될 것이다. 포기된 뮤텍스를 어떻게 처리할 것인가는 프로그래머에게 달린 문제이다.

참고 : Windows API 정복, 가남사 참고

앞으로 뮤텍스의 소유/해제에 각별히 신경쓰자.