Mar*_*Mar 3 c++ windows dll multithreading
大家好,
我有一个包含错误的第三方库.当我调用一个函数时,它可能会挂起.库函数在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;
}
Run Code Online (Sandbox Code Playgroud)
问题
如何终止线程并保持FreeLibrary()工作?
谢谢.
Mic*_*ael 13
不幸的是,你无法安全地任意终止线程.
TerminateThread导致线程立即终止,即使线程持有锁或修改某些内部状态.TerminateThread可能导致应用程序中的随机挂起(如果线程持有锁)或崩溃(如果线程正在修改某个状态并且它保持不一致)
如果您不能相信DLL的行为正确并且这会给您带来严重的可靠性问题,那么您应该将调用DLL的代码移动到一个单独的进程中 - 终止进程会更安全.
| 归档时间: |
|
| 查看次数: |
3544 次 |
| 最近记录: |