如何正确地结束一个dll内悬吊线?(How to terminate a hanging threa

2019-06-25 08:22发布

大家好,

我有一个包含一个错误第三方库。 当我调用一个函数它可能会挂起。 库函数调用一个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则()工作?

谢谢。

Answer 1:

不幸的是,你不能随意安全终止线程。

TerminateThread导致线程立即终止,即使线程持有锁或修改某些内部状态。 TerminateThread可以在应用程序导致随机挂起(如果线程持有锁)或崩溃(如果线程被修改某些状态,并且留下不一致)

如果你不能信任的DLL正确的行为,这是造成显著的可靠性问题对你来说,你应该代码调用DLL移动到一个单独的进程 - 终止过程更加安全。



文章来源: How to terminate a hanging thread inside a dll correctly?