在提升时不一致崩溃::线程::release_handle?



如何检查故障发生的位置?

崩溃不一致,下面是一个示例转储:

00000000`1ae7c850 000007fe`d675a8be : 00000000`0000005e 00000000`2082cb20 00000000`00000000 00000000`20539b00 : boost_thread_vc140_mt_1_62!boost::thread::release_handle+0x26
00000000`1ae7c890 000007fe`d675a802 : 00000000`1ae7c930 00000000`2082cb20 00000000`00000000 000007fe`e2fc57d9 : boost_thread_vc140_mt_1_62!boost::thread::join_noexcept+0x8e
00000000`1ae7c910 000007fe`d23c674b : 000007fe`d2571e10 000007fe`d2614ef0 000007fe`d2614ef0 00000000`00000000 : boost_thread_vc140_mt_1_62!boost::thread::join+0xe2
00000000`1ae7c9d0 000007fe`d2401c94 : 00000000`03d443b0 00000000`03d443b0 00000000`20ff0000 00000000`03d443b0 : ABC::StopProcessMonitor+0x18b

相关代码为:

class ABC {
boost::scoped_ptr<boost::thread> m_threadMonitor;
HANDLE m_hShouldStop;
};
void ABC::StopProcessMonitor() {
if (m_threadMonitor) {
LOG_INFO() << L"Stop monitor thread.";
::SetEvent(m_hShouldStop);
m_threadMonitor->join();
m_threadMonitor.reset();
::CloseHandle(m_hShouldStop);
m_hShouldStop = NULL;
}
}

由于崩溃不一致,因此可能存在争用条件。 尝试思考与线程交互的所有代码,测试用例可以帮助验证这一点。

我在Clang的线程消毒器上取得了很好的成功,解决了类似的问题。

最新更新