如何正确地终止一个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()函数不build议调用。
  2. 正如我之前提到的,线程正在运行在一个dll中 。 如果我使用TerminateThread()终止线程,我的dll不会使用FreeLibrary()甚至FreeLibraryAndExitThread()来卸载。 这两个函数挂起。

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

谢谢。

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

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

如果你不能相信这个DLL的行为是正确的,并且这对你造成了重大的可靠性问题,那么你应该把调用这个DLL的代码移动到一个单独的进程中 – 终止一个进程要安全得多。