WaitForSingleObject()

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.