在卸载DLL时删除静态对象时退出线程导致死锁?

ads*_*px5 6 c++ windows multithreading deadlock

我在延迟加载的DLL中有一个实例(全局/静态对象)ClassA.这个对象里面有一个"Observer"线程,它是执行正常关闭所必需的.当我调用FreeLibrary时,我注意到在删除此静态对象期间,我的线程请求关闭但挂起_endthreadex()并导致死锁.如果我明确地或隐含地调用_endthreadex并不重要.对象是全局的还是静态的 - 无关紧要 - 结果相同.此线程包含在ClassB中(由带有自定义消息循环的模板实现).有一个请求关闭线程(post message)和WaitForSingleObject,它永远不会返回给定的线程heandle.

在代码和关机的任何地方都使用相同的"模板线程类".删除静态obj时唯一的问题.我认为_endthreadex()里面有一些锁已经锁定在dll卸载和删除静态对象上.

线程以_beginthreadex开头.PS.当我在App-app内部实例化相同的静态obj时,没有任何重大问题.

任何想法为什么_endtreadex导致死锁?怎么避免呢?

Har*_*ton 5

这种特殊情况很容易解释._endthreadex调用需要加载器锁定,以便它可以使用DLL_THREAD_DETACH调用DllMain.但是,调用FreeLibrary的线程已经保存了加载程序锁,因为您已经在使用DLL_PROCESS_DETACH调用DllMain.

另一种可以破解的方法是,如果进程在没有显式卸载库的情况下退出,则您的观察者线程将在DLL_PROCESS_DETACH调用之前终止,因此当您尝试发出信号退出时,它将不会响应,因为它没有运行更多.

最好的方法可能是创建显式的InitializeLibrary()和UninitializeLibrary()函数供用户调用.