c++ - 如何正确终止 dll 中的挂起线程?

标签 c++ windows multithreading dll

大家好,

我有一个包含错误的第三方库。当我调用一个函数时,它可能会挂起。库函数在 dll 中被调用。我决定将调用移到线程中并等待一段时间。如果线程完成,则确定。如果不是——我应该强制终止它。

此处的简化示例:

unsigned Counter = 0;
void f()
{
    HANDLE hThread;
    unsigned threadID;

    // Create the second thread.
    hThread = (HANDLE)_beginthreadex( NULL, 0, DoSomething, NULL, 0, &threadID );

    if (WAIT_TIMEOUT == WaitForSingleObject( hThread, 5000 ))
    {
        TerminateThread(hThread, 1);    
        wcout << L"Process is Timed Out";
    }
    else
    {
        wcout << L"Process is Ended OK";
    }

    CloseHandle(hThread);   

    wcout << Counter;
}

unsigned int _stdcall DoSomething( void * /*dummy*/ )
{
    while (1)
    {

        ++Counter;

    }
    _endthreadex( 0 );
    return 0;
}

问题

  1. 不建议调用TerminateThread()函数。
  2. 正如我之前提到的,线程正在dll 中运行。如果我使用 TerminateThread() 终止线程,我的 dll 将不会使用 FreeLibrary() 甚至 FreeLibraryAndExitThread() 卸载。两个函数都挂起。

如何终止线程并保持 FreeLibrary() 正常工作?

谢谢。

最佳答案

不幸的是,您不能任意安全地终止线程。

TerminateThread 会导致线程立即终止,即使线程正在持有锁或修改某些内部状态。 TerminateThread 可能导致您的应用程序随机挂起(如果线程持有锁)或崩溃(如果线程正在修改某些状态并且它保持不一致)

如果您不相信 DLL 会正确运行并且这给您带来了严重的可靠性问题,您应该将调用 DLL 的代码移到一个单独的进程中 - 终止一个进程会更安全。

关于c++ - 如何正确终止 dll 中的挂起线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1004676/

相关文章:

c++ - GCC 和 Clang 之间的不同行为

c - 使用 pthreads 在客户端-服务器设置中终止客户端线程

java - 使用多线程并行运行多个测试

python - 扭曲的线程......如何正确使用它们?

c++ - const_casting 可变字段安全吗?

c++ - Boost Spirit:无法让替代运算符(operator)按我的预期工作

c++ - 如何通过 Crypto++ 和 RSA 对文件进行签名

python - 可以在没有心跳的情况下运行idlex(我想最小化窗口数量)

.net - 如何测量用于 .NET 远程处理的 IP 端口的输入/输出字节数?

windows - 破坏 PS 控制台的简单 PowerShell 脚本