多个线程在C ++中等待相同的事件句柄

时间:2015-02-22 22:23:22

标签: multithreading visual-c++ asynchronous synchronization thread-safety

摘要

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

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

我能想到的唯一事情就是事件不按照我认为他们应该的方式工作,因此问题,或者我的安全,无锁和#34;上面提到的代码实际上并非如此安全和无锁。

1 个答案:

答案 0 :(得分:1)

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