我在应用程序中有一个严重的错误,我试图了解发生了什么。我在崩溃之前有一些日志。我无法简单地重现该错误。
上下文 :
Thread1:
void f()
{
log(thread1_1)
boost::lock_guard< boost::recursive_mutex > lock(mutexABC)
log(thread1_2)
-- eventually corruption heap could occur here
log(thread1_3)
}
Thread2:
void f()
{
log(thread2_1)
boost::lock_guard< boost::recursive_mutex > lock(mutexABC)
-- eventually corruption heap could occur here
log(thread2_2)
}
在我的日志中(我正在使用 LOG4CXX)我有以下顺序:
15:36:45,260 thread2_1
15:36:45,263 thread1_1
15:36:45,265 thread1_2
15:36:45,265 thread2_2
some GUI log thread3_*
15:36:45,276 //application crash
and no thread1_3 log before thread2_2!
我怎么可能在 thread1_3 之前记录 thread2_2 ?由于堆损坏可以解锁锁而不会导致程序崩溃,并且第二个线程可以获取此锁并在应用程序崩溃之前执行一些代码?
我在 Windows 7 下。我的 C++ 程序在编译器优化打开的情况下进入发布模式。