具有互斥锁和事件的WaitForMultipleObjects

时间:2012-09-06 07:30:55

标签: c++ winapi synchronization mutex

如果我有以下C ++代码(对于Windows Os):

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?

我不确定如何处理互斥锁的这种情况。

3 个答案:

答案 0 :(得分:4)

dwR不是零,它是WAIT_OBJECT_0 + 0,这是你在第一个提供的句柄上满足的等待。这是事件的句柄,因此您无需触摸互斥锁。

如果结果是WAIT_OBJECT_0 + 1那么它就是用于成功等待的互斥锁句柄。一旦完成了您需要做的事情,您可以通过调用ReleaseMutex来释放所有权。

答案 1 :(得分:0)

该函数作为互斥锁上的WaitForSingleObject方法。 MSDN(MSDN Example)中有一个示例,它说明了使用WaitForSingleObject获取互斥锁。 WaitForMultipleObjects在使用互斥锁时具有相同的行为。

答案 2 :(得分:0)

这是一个好问题。无论如何,Microsoft文档对此并不十分清楚。

带有bWaitAll = FALSE的WaitForMultipleObjects的文档说:“如果有多个对象被发出信号,则该函数将返回对象被发出信号的数组中第一个句柄的索引。”

但是文档还说“修改仅发生在有信号状态导致函数返回的一个或多个对象上”,这是有道理的,因为否则我们将不知道是否还会获取Mutex。

根据我的实验,WaitForMultipleObjects不会获得“额外”的互斥锁,这很好。