大家好,
我有一个包含错误的第三方库。 当我调用一个函数时,它可能会挂起。 库函数在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; }
问题
如何终止线程并保持FreeLibrary()的工作?
谢谢。
不幸的是,你不能任意地终止一个线程安全。
TerminateThread使线程立即终止,即使线程正在锁定或修改某些内部状态。 TerminateThread可能会导致应用程序(如果线程持有一个锁)或崩溃(如果线程正在修改某个状态,并保持不一致)的随机挂起,
如果你不能相信这个DLL的行为是正确的,并且这对你造成了重大的可靠性问题,那么你应该把调用这个DLL的代码移动到一个单独的进程中 – 终止一个进程要安全得多。