2009-06-17 7 views
2

Hallo alle zusammen,Wie man einen hängenden Thread innerhalb einer DLL korrekt beendet?

Ich habe einen Dritten Bibliothek, die einen Fehler enthält. Wenn ich eine Funktion anrufe, kann es hängen. Die Bibliotheksfunktion wird innerhalb einer DLL aufgerufen. Ich beschloss, den Anruf in den Thread zu verschieben und einige Zeit zu warten. Wenn der Thread fertig ist, dann OK. Wenn nicht - ich sollte es obligatorisch beenden.

Das vereinfachte Beispiel hier:

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

Die Frage

  1. Die TerminateThread() Funktion wird nicht anrufen empfohlen.
  2. Wie bereits erwähnt, läuft der Thread innerhalb einer DLL. Wenn ich den Thread mit TerminateThread() terminieren würde meine DLL nicht entladen mit FreeLibrary() oder sogar FreeLibraryAndExitThread(). Beide Funktionen hängen.

So beenden Sie den Thread und behalten FreeLibrary() funktioniert?

Danke.

+2

vielleicht sollten Sie die rouge dll in einem separaten Prozess hosten und nur den Prozess zu töten, wenn Zeug Birne Form geht? –

Antwort

11

Sie können einen Thread leider nicht sicher terminieren.

TerminateThread bewirkt, dass der Thread sofort beendet wird, auch wenn der Thread Sperren hält oder einen internen Status ändert. TerminateThread kann in Ihrer Anwendung zu einem zufälligen Aufhängen führen (wenn der Thread eine Sperre hielt) oder zu einem Absturz führen (wenn der Thread einen Status änderte und inkonsistent blieb)

Wenn Sie der DLL nicht trauen können, sich korrekt zu verhalten und dies ist Wenn Sie signifikante Zuverlässigkeitsprobleme für Sie verursachen, sollten Sie den Code, der die DLL aufruft, in einen separaten Prozess verschieben - das Beenden eines Prozesses ist viel sicherer.

+0

Gute Einblicke in die Fallstricke eines abrupten Abbrechens eines Threads. – nsantorello

+0

Danke, ich werde versuchen, auf Ihren Rat zu erpressen. – Mar

+0

Ich wünschte, ich könnte dies zweimal nach dem Umgang mit Produktionssystemen, die das Ergebnis von Menschen sind, die denken, dass der Thread beendet werden könnte. –

Verwandte Themen