thread beenden?



  • ich will nen nebenthread beenden:
    aufruf:
    hAcceptThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)RcvProc, NULL, NULL, NULL);

    beenden:
    unsigned long tmp;
    GetExitCodeThread(hAcceptThread, &tmp);
    ExitThread(tmp);

    aber nun wird immer das ganze prog beendet!



  • Du solltest Threads nicht abschießen, sondern auslaufen lassen - sprich in der ThreadProc einfach returnen 😉



  • aso



  • Moderator flenders, bitte erklär uns die Funktion und Benutzung von ExitThread().



  • ExitThread ist eine der Funktionen, die man in C++ niemals benutzen darf. Sie beendet den Thread auf der Stelle und kehrt nicht zurück.
    Für den Compiler ist das allerdings eine ganz normale Funktion, deswegen werden beim Aufruf Stack- und threadlokale Objekte nicht korrekt abgebaut.
    Auch in C ist das Benutzen von ExitThread AFAIK nicht in Ordnung, da threadlokaler Speicher der Standardlib nicht freigegeben wird. In C++ verursacht ExitThread aber auf jeden Fall fehlerhaftes Verhalten des Programms und sollte deswegen gemieden werden.



  • Einen Thread nie abschiesen. Ist er gerade in einer CriticalSection und ich schieße ihn ab, sind die Ressourcen immer noch gesperrt. Mache lieber so was:

    while not Terminated do
    begin
      ...;
      ...;
    end;
    // aufräumen
    

    Terminated ist eine globale Variable, die du entsprechend mit den InterLockDingsbums-Funktionen setzt.



  • Merke: ExitThread != Thread abschießen

    ExitThread beendet den gerade laufenden Thread, nicht irgendeinen.

    Man darf allerdings nicht ExitThread verwenden, sondern _endthread, dann ist alles in Ordnung (Locks sollte man trotzdem vorher zurückgegeben haben).

    pixartist: Kein Wunder, dass sich das Programm beendet, schließlich beendest du den main Thread.



  • Hatte ich da gerade etwas mit TerminateThread verwechselt? 🙄


Anmelden zum Antworten