2012-09-06 50 views
1

如果我有下面的C++代碼(Windows版):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不是很零,它是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在使用Mutex時具有相同的行爲。

+0

是的,謝謝。單個對象很容易。這裏我主要關心的不是創建一個「競爭條件」,當事件發出信號並且互斥體被掛起時,可以這麼說...但是上面的@RomanR證實我只有在WaitForMultipleObjects返回它的索引時才需要釋放互斥體。 – c00000fd