如何正确终止dll中的挂线?

时间:2009-06-17 01:30:09

标签: 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()卸载。这两个功能都挂起了。
  3. 如何终止线程并让 FreeLibrary()工作?

    感谢。

1 个答案:

答案 0 :(得分:13)

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

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

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