Folgendes Problem.. Es laufen unter linux ein paar Threads. Das beenden über einen per Signal getriggerten ExitHandler ist auch kein Problem. Die Thread räumen auch selbst auf usw. und beenden sich.. Aber wenn sich nun ein Thread abnormal oder er muss bewusst abgebrochen werden -> Hardware error oder etc. sendet der ein Signal und das triggert wie gewohnt den ExitHandler. Das Problem dabei ist wenn der Thread schon beendet ist blockiert pthread_chancel() den ExitHandler. Ich hätte erwartet das die Funktion entweder mit einem Error zurückkehrt... Nun könnte man die nicht portablen Varianten benutzen, also nicht blockierend. Nur geben diese kein Return Value zurück, der Pointer ist immer NULL. Offenbar entsteht das gleich Problem das chancel() nicht auf bereits beendete Threads anwendbar ist. Mach ich was bei den Signalen falsch ? Das Flag steht auf RESTART und der Handler kehrt zurück.. Es funktioniert ja wenn die Thread laufen... mit phtread_join() gibt es kein Problem..
:
Bearbeitet durch User
1 | if(pthread_tryjoin_np(thread,NULL) == EBUSY){ |
2 | |
3 | pthread_cancel(thread); |
4 | pthread_join(thread,NULL); |
5 | }
|
EBUSY wird zurückgeliefert wenn der Thread noch nicht beendet wurde -> dann wird er beendet :) Das Problem dabei ist pthread_tryjoin_np() das _np steht für nicht portable. Es funktioniert nur unter Linux so, den Stolperstein wollte ich vermeiden. Mit den Macros pthread_cleanup_push und pthread_cleanup_pop wurde ein exithandler eingerichtet der alle thread spezifischen Dinge ordentlich beendet. Mutex, Filepointer etc.. Vorsicht in den macros sind Klammern enthalten .. pthread_cleanup_push ->{ // thread code pthread_cleanup_pop ->} pthread_cleanup_pop muss also auch verwendet werden wenn der Code diesen gar nicht erreicht.
Marco H. schrieb: > über einen per Signal getriggerten ExitHandler Was meinst du damit? atexit()? pthread_cleanup_push()? Irgend etwas anderes?
Anderer Ansatz: Einen Thread abbrechen ist immer nicht so gut und meistens eine faule Ausrede :-/ Hast du keine Chance, den fraglichen Thread sinnvoll zu beenden? Geh mal in dich und überlege, warum du den Thread wirklich abbrechen möchtest. Vermutlich kommt dabei irgendwas Diffuses bei heraus, was bei nährer Betrachtung auf ein oder zwei Stellen eindampft, an denen man im Thread aussteigen müsste. Sollte das so sein, dann mach es auch :)
Es gibt für jeden Thread einen ExitHander der nur Aufräumarbeiten erledigt die diesen Thread betreffen. Dann gibt es einen Signalhandler getriggerten der andere laufende Threads beendet. Hier gab es das Problem wenn ein Thread schon beendet war. Die Threads werden sauber beendet! Sie werden erst bei der Abbruchbedingung abgebrochen. Es ist so das das weiter laufen der Applikation keinen Sinn hat wenn in einem Thread ein Fehler Auftritt.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.