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