views:

478

answers:

1

Hi Everybody,

I have a third party library that contains an error. When I call a function it may hang. The library function is called inside a dll. I decided to move the call into the thread and wait for some time. If thread is finished then OK. If not – I should terminate it compulsory.

The simplified example here:

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;
}

The Question

  1. The TerminateThread() function is not recommended to call.
  2. As I mentioned before, the thread is running inside a dll. If I terminate the thread using TerminateThread() my dll would not unload using FreeLibrary() or even FreeLibraryAndExitThread(). Both functions hangs.

How to Terminate the thread and keep FreeLibrary() working?

Thanks.

+10  A: 

Unfortunately, you can't arbitrarily terminate a thread safely.

TerminateThread causes the thread to terminate immediately, even if the thread is holding locks or modifying some internal state. TerminateThread can cause random hangs in your application (if the thread was holding a lock) or a crash (if the thread were modifying some state and it is left inconsistent)

If you cannot trust the DLL to behave correctly and this is causing significant reliability issues for you, you should move the code invoking the DLL into a separate process - terminating a process is much safer.

Michael
Good insights on the pitfalls of terminating a thread abruptly.
impulse3d
Thanks, I will try to expriment on your advice.
Mar
I wish I could upvote this twice after dealing with production systems that are the result of people thinking the thread could be terminated.
Adam Mitz