在DLL卸载时终止线程

时间:2015-04-17 09:38:48

标签: c++ multithreading c++11 dll

我正在尝试为第三方软件编写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中的线程?

0 个答案:

没有答案