[英]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.