WaitforSingleObject 2

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

첫 인수가 스레드 핸들일 경우, 스레드가 종료하거나 두번째 인수인 time-out 시간에 도달하면 리턴하게 된다. 그런데 조금 유의할 게 둘이상의 스레드가 대기하는 경우... 타겟 스레드 종료시점이나 타임아웃 시점에 대기순서대로의 실행을 보장해주지 못한다. 이를 테면 WaitForSingleObject(h타겟스레드, 타임아웃); 이런 대기코드가 존재하고 대기 스레드 1이 먼저 대기상태에 들어가고 이후 대기 스레드 2가 대기상태에 들어가고 조금 있다가 대기 스레드 3이 대기상태에 들어간 후 타겟 스레드가 실행이 종료되면 대기상태에 가장 먼저 들어간 스레드 1이 먼저 실행되진 않는다. 대기 스레드 1, 대기 스레드 2, 대기 스레드 3 이런 순으로 항상 실행되지 않는다. 여러 번 테스트해 봤는데 거의 무작위..

API 2012.03.17

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

WAIT_ABANDONED 이 리턴값은 WaitForSingleObject 기타 등등 대기 함수에서 동기화 객체를 소유한 스레드가 terminate되거나 exit 된 경우 발생하게 된다. 크리티컬 섹션 같은 동일 프로세스 내에서만 통용되는 동기화 함수는 이런 기능?을 제공하지 않으므로 소유 스레드가 락 상태가 되면 나머지 기다리는 스레드들은 무한정 대기해버리는 문제가 발생한다. 뮤텍스는 저 기능 하나만으로도 그 동안 매우 유용하게 프로세스 간이나 스레드 간에 잘 사용했다. 그런데 카운트 제한 때문에 세마포어를 사용할 일이 있어서 테스트해보았는데 뮤텍스처럼 불측의 종료시 WAIT_ABANDONED 결과값이 발생하지 않았다. 뮤텍스처럼 이름을 붙이는 것도 가능하고 프로세스 간에도 전역적으로 통용되니 비슷할 ..

API 2012.03.06