【发布时间】:2013-10-17 12:09:34
【问题描述】:
我想知道如何在 Windows 内部处理 setevent。
我有以下情况
在 std::atomic == true 时执行的 Std::thread 线程循环 循环内部是一个 waitforsingleObject,它在警报状态下无限休眠。
一个函数 stopThread() 执行以下操作: - 清除原子布尔值 - 在事件对象上调用 Setevent - 调用thread.join
这个经常挂,我感觉setevent在当前线程还有一些工作要做,而join块 当前线程。
如果我在 waitforsinlgleObject 之后设置的线程中添加一个额外的布尔值,并且我在调用 join() 之前等待它被设置 一切似乎都正常。
代码(此处省略错误检查)
初始化代码/声明:
HANDLE m_WakeupThreadEvent;
std::atomic<bool> m_ReceiverEnabled;
m_WakeupThreadEvent = CreateEvent(NULL, false, false, "RxThreadWakeupEvent" );
线程代码:
while(m_ReceiverEnabled)
{
DWORD rslt = WaitForSingleObjectEx(m_WakeupThreadEvent, INFINITE, true);
// Here some checking for rslt;
}
功能代码:
m_ReceiverEnabled = true;
SetEvent( m_WakeupThreadEvent )
m_Thread.join()
对这种行为有什么解释吗?我找不到有关 setEvent() 操作的任何详细信息
【问题讨论】:
-
请同时显示您的代码,简化为线程部分。我希望您有一个竞争条件:在您触发事件时,线程已检查
std::atomic但尚未开始等待,并且您正在使用自动重置事件。 -
我添加了代码。我不希望出现比赛条件。我发生在线程持续休眠的“被动状态”,所以不检查布尔值。
-
请包括事件的创建和
m_ReceiverEnabled的声明 -
它肯定挂在 WFSOE 上?在当时恰好处理的某些排队的 APC 完成例程中没有?
-
我在完成例程的早期放了一个 return,所以没有执行重要的代码。还在WFSO语句后面加了一个断点,好像没有达到。只有 setEvent 和 Join 之间的延迟似乎有帮助。
标签: c++ multithreading events join c++11