【问题标题】:How to properly implement and close sleeping thread in a Windows DLL如何在 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 卸载时彻底关闭正在休眠的线程?我应该重新设计我的工作线程以以其他方式工作吗?

【问题讨论】:

    标签: multithreading 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 兆字节的内存并让程序处于不确定状态没有任何实际意义。该进程终止将在稍后出现,此时您不再知道实际出了什么问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2019-02-10
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多