繁体   English   中英

如何安全地调用 TerminateThread 和 FreeLibrary (WinAPI, C++)

[英]How to safely call TerminateThread and FreeLibrary (WinAPI, C++)

我曾经通过从使用CreateThread创建的线程调用FreeLibraryAndExitThread来卸载注入的库。

从不同的线程卸载库的需要使得这种方法变得不可能。 现在我正在分别使用TerminateThread (因为它不会终止调用它的线程,但会终止传递的线程)和FreeLibrary 然而,正如 WinAPI 文档所暗示的那样,这会产生“竞争条件”并使进程崩溃。 有没有什么办法解决这一问题?

旧代码:

HMODULE g_hModule{ NULL };

BOOL WINAPI DllMain(HMODULE hModule, DWORD fwdReason, LPVOID lpReserved) {
    g_hModule = hModule;
    if (fwdReason == DLL_PROCESS_ATTACH) {
        DisableThreadLibraryCalls(hModule);
        CreateThread(0, 0, (LPTHREAD_START_ROUTINE)main, 0, 0, 0);
    }

    return TRUE;
}

void Unload(int nExitCode) {
    FreeLibraryAndExitThread(g_hModule, (DWORD)nExitCode);
}

新代码:

HMODULE g_hModule{ NULL };
HANDLE g_hThread{ NULL };

BOOL WINAPI DllMain(HMODULE hModule, DWORD fwdReason, LPVOID lpReserved) {
    g_hModule = hModule;
    if (fwdReason == DLL_PROCESS_ATTACH) {
        DisableThreadLibraryCalls(hModule);
        g_hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)main, 0, 0, 0);
    }

    return TRUE;
}

void Unload(int nExitCode) {
    TerminateThread(g_hThread, (DWORD)nExitCode);
    FreeLibrary(g_hModule);
}

提前感谢您的帮助!

安全终止线程的唯一方法,尤其是在 C++ 中,是让该线程从 function 返回传递给CreateThread 这通常通过设置(比如说)线程定期测试以查看它是否应该退出的atomic<bool>来完成。 您还可以使用条件变量(或 Win32 等效项)来唤醒线程,而不是忙循环。

TerminateThread非常危险,例如,线程可能持有某种关键锁(可能是malloc使用的锁),这会挂起您的应用程序的 rest。 它本来就不应该在 Win32 API 中提供,你不应该使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM