多个线程在 C++ 中等待同一个事件句柄
Multiple threads waiting on the same event handle in C++
总结
如果多个线程同时等待同一个事件句柄,如:
WaitForSingleObject(theHandle, INFINITE);
并且事件被初始化为手动重置,如:
// manual-reset and initial-state set to true
theHandle = CreateEvent(nullptr, true, true, nullptr);
那么一旦设置了事件,所有线程都会恢复吗?
再详细一点
这个例子似乎表明他们都会恢复,但实际上并没有出来说任何一种方式:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686915(v=vs.85).aspx
在我的特殊情况下,我有一小段代码,其中事件是手动重置的,并在短时间内再次设置。即:
ResetEvent(theHandle)
// Do some things that should not lock at all let alone deadlock
SetEvent(theHandle)
然后在实践中我观察到一些等待事件设置的调用将无限期地等待在那里:
WaitForSingleObject(theHandle, INFINITE); // Hello, deadlock
我唯一能想到的是事件没有按照我认为应该的方式工作,因此出现了问题,或者我上面提到的 "safe, lockless" 代码实际上并不那么安全并且无锁。
设置手动重置事件后,所有等待的对象都将恢复。这在 SetEvent 的 MSDN 页面上有明确说明。
总结
如果多个线程同时等待同一个事件句柄,如:
WaitForSingleObject(theHandle, INFINITE);
并且事件被初始化为手动重置,如:
// manual-reset and initial-state set to true
theHandle = CreateEvent(nullptr, true, true, nullptr);
那么一旦设置了事件,所有线程都会恢复吗?
再详细一点
这个例子似乎表明他们都会恢复,但实际上并没有出来说任何一种方式:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686915(v=vs.85).aspx
在我的特殊情况下,我有一小段代码,其中事件是手动重置的,并在短时间内再次设置。即:
ResetEvent(theHandle)
// Do some things that should not lock at all let alone deadlock
SetEvent(theHandle)
然后在实践中我观察到一些等待事件设置的调用将无限期地等待在那里:
WaitForSingleObject(theHandle, INFINITE); // Hello, deadlock
我唯一能想到的是事件没有按照我认为应该的方式工作,因此出现了问题,或者我上面提到的 "safe, lockless" 代码实际上并不那么安全并且无锁。
设置手动重置事件后,所有等待的对象都将恢复。这在 SetEvent 的 MSDN 页面上有明确说明。