【发布时间】:2009-06-17 01:30:08
【问题描述】:
大家好,
我有一个包含错误的第三方库。当我调用一个函数时,它可能会挂起。库函数在 dll 中调用。我决定将调用移到线程中并等待一段时间。如果线程已完成,则 OK。如果不是 - 我应该强制终止它。
这里的简化示例:
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;
}
问题
- TerminateThread()函数不建议调用。
- 正如我之前提到的,线程在 在 dll 中运行。如果我使用 TerminateThread() 终止线程,我的 dll 将不会使用 FreeLibrary() 甚至 FreeLibraryAndExitThread() 卸载。两个函数都挂起。
如何终止线程并保持 FreeLibrary() 正常工作?
谢谢。
【问题讨论】:
-
也许你应该考虑在一个单独的进程中托管 rouge dll,如果东西变成梨形就终止进程?
标签: c++ windows multithreading dll