0

我在下面的代码中看到了崩溃。此方法正在等待使用 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.
........
........

}

我的问题是——

  1. 第一段代码有什么问题吗?根据 boost 文档,它似乎很好。

  2. 即使存在应该以其他方式解决的问题,即如果将过时的句柄传递给它而不是当有效的句柄传递给它时,WaitForSinfleObject() 应该崩溃。有什么想法吗 ?

  3. 我修复错误的方法是否正确?

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

4

0 回答 0