API

뮤텍스와 세마포어,,, WAIT_ABANDONED 발생 여부

디버그정 2012. 3. 6. 19:10

WAIT_ABANDONED 이 리턴값은 WaitForSingleObject 기타 등등 대기 함수에서
동기화 객체를 소유한 스레드가 terminate되거나 exit 된 경우 발생하게 된다.
크리티컬 섹션 같은 동일 프로세스 내에서만 통용되는 동기화 함수는 이런 기능?을 제공하지 않으므로 소유 스레드가 락 상태가 되면
나머지 기다리는 스레드들은 무한정 대기해버리는 문제가 발생한다.
뮤텍스는 저 기능 하나만으로도 그 동안 매우 유용하게 프로세스 간이나 스레드 간에 잘 사용했다.

그런데 카운트 제한 때문에 세마포어를 사용할 일이 있어서 테스트해보았는데
뮤텍스처럼 불측의 종료시 WAIT_ABANDONED 결과값이  발생하지 않았다.
뮤텍스처럼 이름을 붙이는 것도 가능하고 프로세스 간에도 전역적으로 통용되니 비슷할 거라 생각했는데 아니었다.

세마포어 최대 카운트를 3으로 설정하고  4개의 스레드를 시작하면 세마포어 카운트 제한 때문에 1개는 대기중인 상태가 된다.
이 상태에서 TerminateThread로 현재 작동중인 스레드를 죽여 보았는데,,,, 대기중 스레드는 여전히 대기상태로 존재했다.
그러므로 대기함수를 INFINITE로 설정한 경우 불측의 다운의 경우 무한정 대기하는 사태를 초래할 수 있다.