pthread_chancel bei schon beendeten Threads

OP #5682697
Lesenswert?
• ▲
▼
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..
OP #5683649
Lesenswert?
• ▲
▼
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.
Gast #5685083
Lesenswert?
• ▲
▼
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 :)
OP #5685481
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.