如果我有以下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?
我不确定如何处理互斥锁的这种情况。
答案 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不会获得“额外”的互斥锁,这很好。