C++ 中多个线程等待同一事件句柄

Dan*_*Dan 5 multithreading synchronization asynchronous thread-safety visual-c++

概括

如果多个线程同时等待同一个事件句柄,如下所示:

WaitForSingleObject(theHandle, INFINITE);
Run Code Online (Sandbox Code Playgroud)

并且该事件被初始化为手动重置,如下所示:

// manual-reset and initial-state set to true
theHandle = CreateEvent(nullptr, true, true, nullptr);
Run Code Online (Sandbox Code Playgroud)

那么一旦设置了事件,所有线程都会恢复吗?

更详细一点

这个例子似乎表明他们都会恢复,但实际上并没有出来说任何一种方式:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms686915(v=vs.85).aspx

在我的特定情况下,我有一小段代码,其中事件被手动重置,并在短时间内再次设置。IE:

ResetEvent(theHandle)

// Do some things that should not lock at all let alone deadlock

SetEvent(theHandle)
Run Code Online (Sandbox Code Playgroud)

然后在实践中,我观察到一些等待事件设置的调用将无限期地等待:

WaitForSingleObject(theHandle, INFINITE); // Hello, deadlock
Run Code Online (Sandbox Code Playgroud)

我唯一能想到的是事件并没有按照我认为应该的方式工作,因此问题,或者我上面提到的“安全,无锁”代码实际上并不那么安全和无锁。

Sco*_*MVP 2

当设置手动重置事件时,所有等待对象将恢复。SetEvent 的 MSDN 页面上明确说明了这一点。

  • “SetEvent 的 MSDN 页面上明确说明了这一点”是的,但它有些误导。如果在 SetEvent 之后立即调用 ResetEvent(),则不能保证所有等待线程都将运行。某些线程可能已准备好,然后再次设置为等待,但没有实际运行:( (2认同)