我正在尝试为第三方软件编写DLL插件。在插件中,我在托管程序调用的初始化函数中创建一个线程。但是,没有关闭例程,我可以正确地终止线程。我试过这段代码:
DLL_EXPORT void InitFunction() // is called by the host application
{
myThread = std::move(std::thread{myThreadFunction});
}
bool WINAPI DllMain( HINSTANCE hDll, DWORD fdwReason, LPVOID lpvReserved )
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
{
DisableThreadLibraryCalls(hDll);
} break;
case DLL_PROCESS_DETACH:
{
IsRunning.store(false); // tell the thread it's time to terminate;
if(myThread.joinable())
myThread.join();
}break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return true;
}
我知道这不起作用,因为windows会在线程终止时调用DllMain,但是DllMain仍在运行,因此会死锁。我尝试在Dll的不同位置使用DisableThreadLibraryCalls()
,但这也不起作用。那么,我如何正确终止我的DLL中的线程?