运行regsvr32.exe时,带有线程句柄的WaitForSingleObject卡住了

TCS*_*TCS 4 c++ winapi multithreading synchronization waitforsingleobject

我有线程A创建另一个线程B,而线程A正在等待使用WaitForSingleObject等待线程B死亡.

问题是即使线程B从线程的"thread_func"返回,线程A 也不会发出信号!.

我知道因为我在thread_func(线程B的主函数)的末尾添加了跟踪(OutputDebugString),我可以看到线程B完成了它的执行,但线程A永远不会从WaitForSingleObject中出来.

现在,我还必须补充一点,这个代码在一个COM对象中,当我调用regsvr32.exe(它被卡住了!)时,上面描述的场景正在发生,所以我相信线程A来自DLLMain.

任何想法为什么线程A没有得到信号?!?!

DXM*_*DXM 14

你可能遇到装载机锁的问题.Windows,有一个内部关键部分,无论何时加载/卸载DLL或线程启动/停止(DllMain总是在该锁内部调用),它都会被锁定.如果您的等待线程A已将该关键部分锁定(即您正在等待DllMain的某处),而另一个线程B尝试关闭并尝试获取该加载器关键部分,则会出现死锁.

要查看发生死锁的位置,只需从VS IDE调试器运行您的应用程序,然后在它被卡住后,中断执行.然后查看所有正在运行的线程,并记下每个线程的堆栈.您应该能够跟踪每个堆栈并查看每个线程正在等待的内容.