【发布时间】:2009-06-08 12:39:08
【问题描述】:
我在这里陷入了一个非常惊人的问题。代码如下所示。
class A
{
public:
A(){
m_event = CreateEvent(NULL, false, false, NULL); // create an event with initial value as non-signalled
m_thread = _beginthread(StaticThreadEntry, 0, this); // create a thread
}
static void StaticThreadEntry(A * obj) { obj->ThreadEntry(); }
void ThreadEntry();
};
void A::ThreadEntry()
{
WaitforSingleObject(m_event,INFINITE);
}
int main()
{
A a;
SetEvent(m_event); // sets the event to signalled state which causes the running thread to terminate
WaitForSingleObject(m_thread, INFINITE); // waits for the thread to terminate
return 0;
}
问题:
运行上述代码时,有时(5 次中有 1 次)它会挂起,并且控件会卡在对 WaitforSingleObject() 的调用中(在主函数内部)。代码始终调用 SetEvent() 函数以确保线程将在调用 Wait() 函数之前终止。
我看不出它应该挂起的任何原因?
【问题讨论】:
-
我很抱歉人们-所有答案似乎都是错误的。我使用 Sleep() 在我的代码中尝试了所有组合,我没有理由认为它应该挂起?
-
为什么不排序为 m_event=Create... 然后 _beginthread?
-
如果问题中的代码不正确,您需要编辑它 - 许多人指出了一个错误,然后您在评论中说它不存在。目前我很困惑,所以无能为力。
-
你为什么不编译你的例子,看看它是否重现了这个问题?在我看来,它没有。这段代码没有任何错误,除了 m_event/m_thread 范围,我认为这只是您在示例中遗漏的内容。
-
在提出此类问题时,几乎总是需要发布重现问题的可编译代码。通常很难诊断与计时相关的错误——为什么要把它变成一个猜谜游戏?如果你不能发布真正的代码(因为它太复杂,有太多的依赖,或者是专有的),那么把它减少到一个小的重现案例通常会有向你展示问题的好处,所以你不会甚至需要发布一个问题。
标签: c++ multithreading winapi