Forum: PC-Programmierung pthread_chancel bei schon beendeten Threads


von Marco H. (damarco)


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..

: Bearbeitet durch User
von Marco H. (damarco)


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.

von Clemens L. (c_l)


Lesenswert?

Marco H. schrieb:
> über einen per Signal getriggerten ExitHandler

Was meinst du damit? atexit()? pthread_cleanup_push()? Irgend etwas 
anderes?

von Sven P. (Gast)


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 :)

von Marco H. (damarco)


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.

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
Noch kein Account? Hier anmelden.