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)
我唯一能想到的是事件并没有按照我认为应该的方式工作,因此问题,或者我上面提到的“安全,无锁”代码实际上并不那么安全和无锁。
当设置手动重置事件时,所有等待对象将恢复。SetEvent 的 MSDN 页面上明确说明了这一点。
| 归档时间: |
|
| 查看次数: |
4646 次 |
| 最近记录: |