在卸载 DLL 期间删除静态对象时退出线程会导致死锁
Exit thread upon deleting static object during unload DLL causes deadlock?
我在延迟加载的 DLL 中有一个实例(全局/静态对象(ClassA。这个对象里面有一个"观察者"线程,这是执行正常关闭所必需的。当我调用 FreeLibrary 时,我注意到在删除此静态对象期间,我的线程请求关闭,但挂起在 _endthreadex(( 上并导致死锁。我是否显式或隐式地调用_endthreadex并不重要。对象是全局的还是静态的并不重要 - 相同的结果。此线程包装在 ClassB 中(由具有自定义消息循环的模板实现(。有一个关闭线程(发布消息(的请求,并遵循 WaitForSingleObject,它永远不会返回给定的线程 heandle。
在代码和关闭中随处使用相同的"模板线程类"效果很好。删除静态对象时的唯一问题。我认为 _endthreadex(( 内部有一些锁,它已经在 dll 卸载和删除静态对象时被锁定。
线程从_beginthreadex开始。当我在应用程序内实例化相同的静态 obj 时 - 应用程序关闭没有任何重大问题。
知道为什么_endtreadex会导致死锁吗?如何避免?
这种特殊情况很容易解释。 _endthreadex调用需要加载程序锁,以便它可以调用 DllMain DLL_THREAD_DETACH。 但是,调用 FreeLibrary 的线程已经持有加载程序锁,因为您已经在使用 DLL_PROCESS_DETACH 调用 DllMain 的过程中。
另一种可能中断的方式是,如果进程在没有显式卸载库的情况下退出,则观察器线程将在DLL_PROCESS_DETACH调用之前终止,因此当您尝试向其发出退出信号时,它不会响应,因为它不再运行。
最好的方法可能是创建显式的 InitializeLibrary(( 和 UninitializeLibrary(( 函数供用户调用。
- std::async 如果线程是从 DLL 创建的,则会阻止进程退出?
- 在线程退出之前,线程分配的内存块是否与线程本身具有相同的相关性?
- STD ::线程不会退出
- C++线程退出循环条件
- gdb 中的线程 0x7fffc57fa700 (LWP 31671) 退出] 是什么意思?
- 如何使用工作线程正确退出Qt应用程序
- Boost.Asio:由于线程退出或应用程序请求,I/O 操作已中止
- 当子线程退出时,如何通知父线程
- 线程退出时通知Waiters
- 线程退出时 DLL 中的 MFC 无模式对话框被销毁
- prctl(PR_SET_PDEATHSIG, SIGNAL) 在父线程退出时调用,而不是在父进程退出时调用
- 通知线程退出
- 如何在 Windows 上的线程退出时释放 TLS 插槽中的对象
- 将参数从主线程传递到线程.当线程退出时,主线程将重置为0.为什么?
- 在没有c++11的情况下,使用boost标记线程退出的正确方法是什么
- 异步ReadDirectoryChangesW调用阻止线程退出
- 如何检测线程退出窗口的原因
- 希望线程在父线程退出时不会死亡- linux
- 线程退出时的清理
- c++子线程在main()父线程退出时终止