我陷入了一个非常令人惊讶的问题,here.The代码如下。
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()的调用中(在main函数内部).The代码总是调用SetEvent()函数,以确保线程在调用Wait()函数之前终止。
我看不出有什么理由让它挂起来?
发布于 2009-06-08 16:51:03
问题在于您对_beginthread应用编程接口的使用。不能将此函数返回的句柄与Win32等待函数一起使用。您应该使用_beginthreadex或CreateThread。来自MSDN:
如果成功,这些函数中的每个函数都会返回新创建的线程的句柄;但是,如果新创建的线程退出得太快,_beginthread可能不会返回有效的句柄...
你是..。可以将_beginthreadex返回的线程句柄与同步API一起使用,这在_beginthread中是做不到的。
发布于 2009-06-08 13:28:07
我在代码中没有看到任何问题(假设事件是在线程在构造函数中启动之前创建的)。
假设这是完整的代码(不是样例代码),对我来说它看起来很好。
我建议您使用process Explorer来观察事件的状态。
编辑
在主线程等待线程句柄之前,子线程被终止的可能性很小。如果句柄被重用于其他一些内核对象,主线程将无限期地等待。尝试在创建线程后使用DuplicateHandle复制句柄,并在WaitForSingleObject中使用此句柄。
发布于 2009-06-08 13:42:17
您可能希望考虑使用SignalObjectAndWait而不是单独的SetEvent()和WaitForSingleObject()调用,因为这是作为单个操作发生的,并且如果不能用信号通知事件,它将立即失败。
https://stackoverflow.com/questions/964719
复制相似问题