pthread Verständnisfragen
-
Hallo Leute,
ich hätte da mal zwei Verständnisfragen zu den pthreads.
Angenommen ich habe im Mainthread weitere 10 Threads gestartet. Jetzt will ich im Mainthread auf alle anderen warten bis sie sich mit pthread_exit() beenden.
1. Ist es ein Problem, wenn sich ein Thread schon vor dem pthread_join() Aufruf im Mainthread beendet? Also würde dann pthread_join() dauerhaft blockieren, weil der Thread mit der ID schon längst beendet ist?
2. Wenn ich mit einer for() Schleife auf alle Threads nacheinander warte, müssen diese sich dann auch der Reihenfolge nach beenden?
Also ich vermute mal beide Fragen kann man klar mit "Nein" beantworten, aber ich bin mir eben nicht sicher.
Schonmal vielen Dank!
-
man pthread_join schrieb:
The pthread_join() function shall suspend execution of the calling thread until the target thread terminates, unless the target thread has already terminated.
das sagt, dass pthread_join blockiert, solange der thread, den du joinen willst, noch läuft. läuft der thread nicht mehr vor dem aufruf von pthread_join, kehrt pthread_join sofort zurück. läuft er beim aufruf noch, wartet pthread_join solange, bis er sich beendet hat (oder wurde).
die reihenfolge, in der sich die threads beenden, ist im allgemeinen undefiniert - aus verschiedenen gründen.
-
Vielen Dank für die Antwort.
Jetzt bin ich rundum glücklich
PS: das nächste mal les ich selber im Manual nach, keine Ahnung warum ich das hier nicht gemacht habe...
-
Ich stehe grad vor dem Problem, dass weiterhin gewartet wird, obwohl ich den thread mit pthread_cancel() gekillt habe (der Thread läuft auch wirklich nicht mehr) jedoch wartet pthread_join() weiterhin auf ihn?
-
Ynusis schrieb:
Ich stehe grad vor dem Problem, dass weiterhin gewartet wird, obwohl ich den thread mit pthread_cancel() gekillt habe (der Thread läuft auch wirklich nicht mehr) jedoch wartet pthread_join() weiterhin auf ihn?
Code der das zeigt?
Ansonsten: Verwende pthread_cancel nicht!
-
Naja, den Code kann man nicht so einfach zeigen.
Ich habe mehrer Threads am laufen. In einem wird auf eine Benutzereingabe gewartet. Wird dort 'q' eingegeben sollen alle Threads mit pthread_cancel gekillt werden, sind 2 Socket Listener. Das funktioniert auch. Nur wartet pthread_join dann immernoch.
Also pthread_cancel wird nach pthread_join in einem seperaten Thread aufgerufen.
-
Ynusis schrieb:
Naja, den Code kann man nicht so einfach zeigen.
Ich habe mehrer Threads am laufen. In einem wird auf eine Benutzereingabe gewartet. Wird dort 'q' eingegeben sollen alle Threads mit pthread_cancel gekillt werden, sind 2 Socket Listener. Das funktioniert auch. Nur wartet pthread_join dann immernoch.
Also pthread_cancel wird nach pthread_join in einem seperaten Thread aufgerufen.
Ohne den Code vor sich zu sehen, kann man dir bei deinem Problem gerade nicht
wirklich helfen.Aber vielleicht doch einen anderen Vorschlag:
Teile dem Thread mit, dass er sich selbst beenden soll. Dafür kannst du ja
in regelmäßigen Abständen eine Zustandsvariable im Thread abfragen und anhand
deren Zustand entsprechend reagieren.Ein Thread bekommt die Info: <Programm beenden>
Dieser Thread setzt die Zustandsvariable jeden Threads auf: <Thread stop>Jeder Thread schaut zu definierten Zeitpunkten nach, findet dann die Info
<Thread stop> und beendet sich ordnungsgemäß.So sollte dann auch das pthread_join anständig funktionieren.
Aber wie gesagt, ohne deinen Code können wir dir nicht wirklich weiterhelfen.
Meine AllWissendeInDieZukunftSchauendeKugel ist gerade in Reparatur.Gruß mcr
-
mcr schrieb:
Aber vielleicht doch einen anderen Vorschlag:
Teile dem Thread mit, dass er sich selbst beenden soll. Dafür kannst du ja
in regelmäßigen Abständen eine Zustandsvariable im Thread abfragen und anhand
deren Zustand entsprechend reagieren.Ein Thread bekommt die Info: <Programm beenden>
Dieser Thread setzt die Zustandsvariable jeden Threads auf: <Thread stop>Jeder Thread schaut zu definierten Zeitpunkten nach, findet dann die Info
<Thread stop> und beendet sich ordnungsgemäß.Das hört sich ja nach Polling an. Polling sollte jedoch soweit wie möglich vermieden werden; vor allem, wenn man bereits auf IO wartet.