DLL ExitInstance上的线程消失
Threads disappeared on DLL ExitInstance
我有一个windows DLL函数InitInstance和ExitInstance。DLL创建一些线程,带有_beginthreadx的工作线程和带有Message Queue的线程,源自CWinThread (MFC).
DLL应该可以被任何应用程序使用。
我为这个DLL写了一个小的主机应用程序来测试,它工作得很好,除了当我关闭这个主机应用程序没有调用FreeLibrary之前。在本例中是ExitInstance也调用,但是所有线程都消失了,这是非常不寻常的,并导致死锁作为一些例程等待线程完成,它不再存在-因为它是完成或杀死。我需要走这种方式(跳过调用FreeLibrary),以模拟可能发生的事情其他应用程序使用这个DLL。
ExitInstance被调用,但是所有的线程通常仍在运行的消失-很可能是因为DLL的处理方式不同
当从宿主进程中卸载时,如果你之前没有调用FreeLibrary它们无声地消失,例如,如果一个线程只是在循环中使用WaitForSingleObject实现一个循环,那么这个线程不会正常结束。
thread()
{
while(running == true)
{
WaitForSingleObject(...);
}
threadfinished=true; /// 1
}
如果在关闭应用程序之前调用FreeLibrary,则调用代码节1。在没有调用FreeLibrary之前关闭应用程序时,永远不会调用代码节1但是,当线程被删除时,循环也不再运行。
我该如何处理这种情况?谢谢你
CWinThread::ExitInstance
的文档非常明确:"除了在Run
成员函数中,不要从任何地方调用这个成员函数。"(即CWinThread::Run
,线程本身)。
显然,这意味着Windows不会为您调用ExitInstance
。主机应用程序也不知道,因为它不知道你的线程。
被调用的是DllMain
,但只有一次,并且带参数DLL_PROCESS_DETACH
。你不会得到DLL_THREAD_DETACH
,因为这发生在之后,你的线程干净地退出(即ExitInstance
或从CWinThread::Run
返回)。
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- 线程在 read() 上阻塞时"消失",如何调试它?
- 线程加载图像的速度更快,直到它们在Studio中消失
- DLL ExitInstance上的线程消失
- 在窗口关闭(或其拥有线程消失)时收到通知