2

如果我有以下 C++ 代码(适用于 Windows 操作系统):

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

3 回答 3

4

dwR不是完全为零,而是WAIT_OBJECT_0 + 0,那是您对第一个提供的句柄的等待得到了满足。这是事件的句柄,所以你不需要触摸你的互斥锁。

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

于 2012-09-06T07:36:18.677 回答
0

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

于 2012-09-06T07:41:34.233 回答
0

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

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

但是文档还说“仅对信号状态导致函数返回的对象或对象进行修改”,这是有道理的,因为否则我们将不知道是否还会获得 Mutex。

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

于 2020-10-27T17:22:20.237 回答