C++ 使用boost::thread::native_handle()在WaitForSingleObject中崩溃

C++ 使用boost::thread::native_handle()在WaitForSingleObject中崩溃,c++,multithreading,winapi,boost,C++,Multithreading,Winapi,Boost,我在下面的代码中看到了崩溃。此方法正在等待使用boost::thread()api创建的线程完成。根据boost,下面的代码似乎是正确的,但我始终观察到以下行为 如果线程T1在调用reach到WaitforSingleObject时已经完成,这意味着在WaitforSingleObject中传递了一个过时的句柄,那么什么也不发生,它返回0。 但若线程T1仍然存在,并且控件到达waitforSingleObject(),则表示向waitforSingleObject传递了一个有效句柄,但它立即崩溃

我在下面的代码中看到了崩溃。此方法正在等待使用boost::thread()api创建的线程完成。根据boost,下面的代码似乎是正确的,但我始终观察到以下行为

如果线程T1在调用reach到WaitforSingleObject时已经完成,这意味着在WaitforSingleObject中传递了一个过时的句柄,那么什么也不发生,它返回0。
但若线程T1仍然存在,并且控件到达waitforSingleObject(),则表示向waitforSingleObject传递了一个有效句柄,但它立即崩溃

问题代码-

void waitForJoin( volatile int &exit_now, boost::thread &T1  )  {

.........
.........
WaitForSingleObject( T1.native_handle(), INFINITE );  // Crashes here. 
........
........

}
当我用join()方法替换WaitForSingleObject()时,一切正常

void waitForJoin( volatile int &exit_now, boost::thread &T1  )  {

.........
.........
T1.join() // Works.
........
........

}
我的问题是——

  • 第一段代码中是否有错误。根据boost文档,它看起来不错

  • 即使存在应该以另一种方式解决的问题,例如,如果传递给它的旧句柄不是有效句柄,WaitForSemingObject()也会崩溃。有什么想法吗

  • 我修复错误的方法正确吗


  • 注意-我无法调试这个问题,因为在调试器中,当控件到达调试器中的WaitForSingleObject时,T1已经完成了它的执行,所以我没有观察到任何崩溃

    只需编辑T1的代码并在那里放置类似5分钟睡眠的内容,然后调试waitForJoin。你们有什么样的崩溃?@Peter若我尝试调试或打开所有调试跟踪,那个么问题就不会发生。我们在T1阶段的5分钟睡眠中想要实现什么?这是应用程序崩溃。如果没有Join()调用,T1就不存在了,调用本机的\u handle()会失败吗?分离调用-将结果从native_handle()加载到临时句柄中,并查看是NH还是WFSO失败。当您不断重复应用程序崩溃时,您没有描述这是什么意思。有很多场景人们会称之为“崩溃”,包括由于未处理的异常而导致的确定性进程关闭。另外,您是否尝试过在调试器下运行发布版本,并在引发SEH(Win32)异常时启用中断调试器?如果不是的话,你应该做得比撞车更好。请发送诊断和错误消息。