gpt4 book ai didi

c++ - 线程在 DLL ExitInstance 上消失

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:01 25 4
gpt4 key购买 nike

我有一个带有函数 InitInstance 和 ExitInstance 的 Windows DLL。DLL 创建一些线程,使用 _beginthreadex 的工作线程和使用 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 返回)。

顺便说一句,请考虑在卸载 DLL 后您的线程可以运行什么代码。它不能是您的函数或 MFC,因为这些函数已不存在。线程会因访问冲突而崩溃,因为它的指令指针现在指向未分配的内存。

关于c++ - 线程在 DLL ExitInstance 上消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15832588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com