2012-09-06 2 views
1

내가 (윈도우 OS의 경우) 다음과 같은 C++ 코드가있는 경우 :와 WaitForMultipleObjects

HANDLE hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); 
HANDLE hMutex = ::CreateMutex(NULL, FALSE, NULL); 

HANDLE hHandles[] = { 
    hEvent, 
    hMutex 
}; 

DWORD dwR = ::WaitForMultipleObjects(2, hHandles, FALSE, INFINITE) - WAIT_OBJECT_0; 

//if dwR == 0, what state is hMutex in? 
//Or, do I need to call ReleaseMutex(hMutex) in that case? 

내가 뮤텍스에 대한이 상황을 처리하는 방법을 잘 모르겠어요 있습니다.

답변

4

dwR은 0이 아니며, WAIT_OBJECT_0 + 0입니다. 즉, 기다림이 처음 제공된 핸들에서 만족 스럽습니다. 이것은 이벤트 핸들이므로 뮤텍스를 만질 필요가 없습니다.

결과가 WAIT_OBJECT_0 + 1이면 기다리는 데 성공한 뮤텍스 핸들이었습니다. 그리고 당신이해야 할 일을 다 끝내면 ReleaseMutex에 전화해서 소유권을 해제합니다.

+0

감사합니다. 그것이 내가 알아야 할 것이 었습니다. 그런데 WAIT_OBJECT_0에 대해서 말하기 전에 그것을 뺀 것입니다. – c00000fd

+0

아, 네가 그랬어. 미안, 그 부분을 놓쳤다. –

+2

당신처럼 무조건적으로 빼지 마십시오. 'WaitForMultipleObject()'는'WAIT_OBJECT_0'을 뽑아 내서는 안되는 다른 에러 코드를 반환 할 수 있습니다. 'WaitForMultipleObjects()'가'WAIT_OBJECT_0 + 0' 또는'WAIT_OBJECT_0 + 1'을 반환하면 빼기 만합니다. –

0

이 함수는 뮤텍스에서 WaitForSingleObject 메서드로 작동합니다. MSDN (MSDN Example)에는 WaitForSingleObject를 사용하여 뮤텍스를 획득하는 예제가 있습니다. WaitForMultipleObjects는 뮤텍스를 사용하는 동안 동일한 동작을합니다.

+0

예, 고마워요. 단일 개체는 쉽습니다. 내 주요 관심사는 여기에 이벤트가 신호를 보내고 뮤텍스가 걸려있을 때 "경쟁 조건"을 만들지 않는 것입니다. 그러나 말하자면 위의 @RomanR은 WaitForMultipleObjects가 인덱스를 반환 할 때만 뮤텍스를 릴리스해야한다고 확인했습니다. – c00000fd

관련 문제