我在下面的代码中看到了崩溃。此方法正在等待使用 boost::thread() api 创建的线程完成。根据以下代码的 boost文档似乎是正确的,但我始终观察到以下行为
如果线程 T1 在调用到达 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 文档,它似乎很好。
即使存在应该以其他方式解决的问题,即如果将过时的句柄传递给它而不是当有效的句柄传递给它时,WaitForSinfleObject() 应该崩溃。有什么想法吗 ?
我修复错误的方法是否正确?
注意 - 我无法调试此问题,因为在调试器中,当控制到达调试器中的 WaitForSingleObject 时,T1 已经完成了它的执行,所以我没有观察到任何崩溃。