如何在 Windows DLL 中正确实现和关闭休眠线程

Posted

技术标签:

【中文标题】如何在 Windows DLL 中正确实现和关闭休眠线程【英文标题】:How to properly implement and close sleeping thread in a Windows DLL 【发布时间】:2011-08-15 07:44:40 【问题描述】:

我有一个用 C 语言编写的本地 Windows DLL。这个 DLL 旨在加载(注入)到不同的 Windows 进程中。该 DLL 创建了一些工作线程,如下所示:

while(1) 
    // do work
    Sleep(few secs);

问题是如果进程退出并且 DLL 在线程处于 Sleep() 时卸载,它会在进程从睡眠返回时崩溃(线程将尝试执行不存在的代码)。我正在考虑将 TerminateThread() 与 DllUnload 处理程序一起使用,但 MSDN 说它应该只在最极端的情况下使用。例如 - 我的线程使用关键部分,文档说:

如果目标线程拥有临界区,则临界区不会被释放。

如何在 DLL 卸载时彻底关闭正在休眠的线程?我应该重新设计我的工作线程以以其他方式工作吗?

【问题讨论】:

【参考方案1】:

创建一个事件:

HANDLE threadTerminationEvent = CreateEvent(.....);

使用WaitForSingleObject 代替Sleep

while (1)

    ...........
    if (WaitForSingleObject(threadTerminationEvent, few secs) != WAIT_TIMEOUT)
        break;

// release resources and end thread

等待线程自行结束:

SetEvent(threadTerminationEvent); // “please, die”
WaitForSingleObject(hThread, INFINITE);

【讨论】:

从不在这种情况下使用 TerminateThread,它只在程序关闭时是安全的。只需将 INFINITE 传递给 WFSO。 我过去使用过 INFINITE,当线程出现问题时会挂断。在大约 30 秒后不安全地终止线程不是比永远冻结并让用户终止整个进程更实际吗? 泄露 1 兆字节的内存并让程序处于不确定状态没有任何实际意义。该进程终止将在稍后出现,此时您不再知道实际出了什么问题。

以上是关于如何在 Windows DLL 中正确实现和关闭休眠线程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 10 UWP 中正确实现语音识别

如何在我的 for 循环中正确实现睡眠功能? (Ubuntu)

如何在c#中正确实现等待异步[重复]

如何在 GWT Web 应用程序中正确实现 DAO?

如何在python的类中正确实现辅助函数

在这种情况下,如何在 Flutter 中正确实现 FutureBuilder?