在卸载DLL原因僵局中删除静态对象退出线程?(Exit thread upon deleting s

2019-06-24 04:16发布

我有我的延迟加载的DLL里面一个实例(全局/静态对象)ClassA的。 这个对象内部具有需要执行正常关机的“观察者”的线程。 当我调用FreeLibrary我注意到,这是静态对象的删除过程中我的线程要求关机,但挂在_endthreadex()和原因僵局。 如果我显式或隐式调用_endthreadex没关系。 这不要紧,如果对象是全局或静态 - 同样的结果。 这个线程包裹在ClassB的(由模板的自定义消息循环实现)。 有关机螺纹(POST消息)和以下WaitForSingleObject的从未返回给定线程heandle的请求。

在代码和关机到处使用相同的“模板线程类”的伟大工程。 删除静态OBJ时,唯一的问题。 我认为这是_endthreadex的内部(一些锁),这是已经被锁定在DLL卸载和静态对象的删除。

螺纹开始_beginthreadex。 PS。 当我实例化的应用内相同的静态OBJ - 应用程序关闭,没有任何显著的问题。

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

Answer 1:

这种特殊的情况下,很容易解释。 该_endthreadex调用需要加载程序锁,以便它可以与DLL_THREAD_DETACH调用的DllMain。 调用FreeLibrary则线程,但是,已经持有加载程序锁,因为你在通话与DLL_PROCESS_DETACH的DllMain来的中间是已。

另一种方式这可以打破的是,如果进程退出而不明确地卸载库,你的观察者线程将在DLL_PROCESS_DETACH调用之前终止,所以当你尝试,以表示它退出,因为它不运行它不会响应任何更多。

最好的办法可能是创建明确InitializeLibrary()和UninitializeLibrary()函数供用户调用。



文章来源: Exit thread upon deleting static object during unload DLL causes deadlock?