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

C++ 如何安全地调用TerminateThread和FreeLibrary(WinAPI、C+;+;),c++,windows,winapi,C++,Windows,Winapi,我曾经通过从使用CreateThread创建的线程调用freelLibraryAndExitThread来卸载注入的库 需要从不同的线程卸载库,这使得这种方法不可能实现。现在我分别使用TerminateThread(因为它不终止调用它的线程,而是终止传递的线程)和freebrary。然而,正如WinAPI文档所建议的那样,这会创建一个“竞争条件”,并使进程崩溃。有办法解决这个问题吗 旧代码: HMODULE g_hModule{ NULL }; BOOL WINAPI DllMain(HMOD

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

需要从不同的线程卸载库,这使得这种方法不可能实现。现在我分别使用
TerminateThread
(因为它不终止调用它的线程,而是终止传递的线程)和
freebrary
。然而,正如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);
}

提前感谢您的帮助 CREATESTOR> 。这通常是通过设置(比如)线程定期测试的
原子
来完成的,以查看它是否应该退出。您还可以使用条件变量(或Win32等效变量)来唤醒线程,而不是忙于循环


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

这是否回答了您的问题?在任何情况下,在这里搜索“[c++]terminate thread”,您将发现大量信息。在进一步探索此路径之前,请理解终止线程的含义。简短回答:没有。C++不这样工作。通过除从原始线程函数返回之外的任何方式终止线程都是未定义的行为<代码>终端线程< /代码>没有C++代码的明确定义的行为。它不意味着与C++代码一起使用。新代码在所有情况下都是错误的和无意义的。code>TerminateThread-终止自线程<代码>免费库从未被调用。没有意义创建线程只是终止它(甚至不正确退出)。旧代码看起来是正确的(假设
main==Unload
和Unload的错误签名),在旧代码中
Unload
是从
main
调用的(由
CreateThread
创建的线程),在新代码中它是从单独的线程调用的。这就是为什么我认为
freebrary
应该运行
ULONG-WINAPI-Unload(PVOID){freebraryandexitthread((HMODULE)和uu-ImageBase,0);
CreateThread(0,0,Unload,0,0,0)
这就是代码需要的样子,但是
TerminateThread
与问题有什么关系?关于如何从该dll中取消引用dll的问题。@RbMm OP说他正在使用它…OP想要卸载dll。绝对与TerminateThread无关