首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WaitForSingleObject( )

WaitForSingleObject( )
EN

Stack Overflow用户
提问于 2009-06-08 12:39:09
回答 7查看 42.6K关注 0票数 3

我陷入了一个非常令人惊讶的问题,here.The代码如下。

代码语言:javascript
复制
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()函数之前终止。

我看不出有什么理由让它挂起来?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-06-08 16:51:03

问题在于您对_beginthread应用编程接口的使用。不能将此函数返回的句柄与Win32等待函数一起使用。您应该使用_beginthreadex或CreateThread。来自MSDN:

如果成功,这些函数中的每个函数都会返回新创建的线程的句柄;但是,如果新创建的线程退出得太快,_beginthread可能不会返回有效的句柄...

你是..。可以将_beginthreadex返回的线程句柄与同步API一起使用,这在_beginthread中是做不到的。

票数 17
EN

Stack Overflow用户

发布于 2009-06-08 13:28:07

我在代码中没有看到任何问题(假设事件是在线程在构造函数中启动之前创建的)。

  • 该事件是自动重置事件,初始状态为non signaled.
  • Child线程必须等待,直到发出事件信号。
  • 主线程将发出事件信号,并等待子进程终止。

假设这是完整的代码(不是样例代码),对我来说它看起来很好。

我建议您使用process Explorer来观察事件的状态。

编辑

在主线程等待线程句柄之前,子线程被终止的可能性很小。如果句柄被重用于其他一些内核对象,主线程将无限期地等待。尝试在创建线程后使用DuplicateHandle复制句柄,并在WaitForSingleObject中使用此句柄。

票数 2
EN

Stack Overflow用户

发布于 2009-06-08 13:42:17

您可能希望考虑使用SignalObjectAndWait而不是单独的SetEvent()WaitForSingleObject()调用,因为这是作为单个操作发生的,并且如果不能用信号通知事件,它将立即失败。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/964719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档