为什么我的程序使用拥有线程生成LdrpLoaderLock死锁?

时间:2012-12-11 20:31:47

标签: c++ multithreading winapi deadlock

我开发了一个我已经工作多年的c ++应用程序。我们最近在测试实验室中添加了4台处理器测试机。

执行此操作后,我们发现在负载下的特定测试会间歇性地导致LdrpLoaderLock死锁,并且拥有的线程不再运行。拥有的线程id通常在数字上是暗示的,因为从正在运行的线程中推断出一个可能的线程id,并且锁存储器结构看起来不会损坏。

我在调试器中没有遇到此问题。事情发生后我才能看到它。我开始记录我正在创建的所有线程,我没有在那里看到问题线程ID。这可能没有意义,因为在发生死锁之后,日志记录可能无法正常工作。我想我需要一种方法来跟踪线程创建和入口点,以便我可以找出正在执行此操作的线程。任何帮助表示赞赏。

来自windbg

0:000> !locks
CritSec ntdll!LdrpLoaderLock+0 at 775d20c0
WaiterWoken        No
LockCount          5
RecursionCount     2
OwningThread       f38
EntryCount         0
ContentionCount    5
*** Locked

扫描了805个关键部分

0:000> !threads
Index   TID
0   00000ab8
1   000008cc
2   00000e68
3   0000134c
4   00000c44
5   000011a0
6   00000f18
7   00000908
8   00001084
9   00000f08
10  00001098
11  00001010
12  00000d40
13  0000135c

线程堆栈消耗的VM总量0x031cf000

0:000> d 775d20c0
775d20c0  60 43 5d 77 ea ff ff ff-02 00 00 00 38 0f 00 00  `C]w........8...
775d20d0  ac 04 00 00 00 00 00 00-40 43 5d 77 ff ff ff ff  ........@C]w....
775d20e0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 02  ................
775d20f0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
775d2100  00 49 5d 77 ff ff ff ff-00 00 00 00 00 00 00 00  .I]w............
775d2110  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
775d2120  20 49 5d 77 ff ff ff ff-00 00 00 00 00 00 00 00   I]w............
775d2130  00 00 00 00 a0 0f 00 00-00 00 00 00 00 00 00 00  ................

1 个答案:

答案 0 :(得分:1)

雷蒙德陈是对的。我正在调用第三方com组件。它创建了一个线程,然后在析构函数中调用TerminateThread。幸运的是,我有源许可证,否则我将永远亏本。在该析构函数中注释掉TerminateThread调用并重建修复了我的问题。现在让第三方修复他们的代码。