Rak*_*wal 3 c++ winapi multithreading
我在这里遇到了一个非常惊人的问题.代码如下所示.
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;
}
Run Code Online (Sandbox Code Playgroud)
问题:
当运行上面的代码时,有时(5个中的1个)它会挂起并且控件卡在WaitforSingleObject()的调用中(在main函数内).代码总是调用SetEvent()函数来确保线程终止在调用Wait()函数之前.
我没有看到为什么它应该挂起来的任何理由?
Pet*_*man 17
问题是您使用_beginthread API.您不能使用Win32等待函数从此函数返回的句柄.您应该使用_beginthreadex或CreateThread.来自MSDN:
如果成功,则每个函数都返回新创建的线程的句柄; 但是,如果新创建的线程退出太快,_beginthread可能不会返回有效的句柄...
您是...能够使用_beginthreadex返回的线程句柄和同步API,而您无法使用_beginthread.