05.11.2013 Aufrufe

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

106 3 Programmieren <strong>mit</strong> POSIX-<strong>Threads</strong><br />

Sobald der Rückgabewert eines Pthreads <strong>mit</strong>tels pthread_join() abgerufen<br />

wurde (dies ist auch dann der Fall, wenn pthread_join() <strong>mit</strong> einem Nullzeiger<br />

für value_ptr aufgerufen wurde!), wird dieser Thread vom System<br />

endgültig freigegeben. Dies heißt, daß alle Ressourcen des <strong>Threads</strong>, insbesondere<br />

auch der hinterlegte Rückgabewert, freigegeben werden <strong>und</strong> da<strong>mit</strong> nicht<br />

mehr weiter zur Verfügung stehen. In der Konsequenz bedeutet das auch,<br />

daß auf einen Pthread genau ein pthread_join() ausgeführt werden kann.<br />

Führen mehrere <strong>Threads</strong> gleichzeitige Aufrufe von pthread_join() <strong>mit</strong> dem<br />

selben Thread als Ziel aus, so bleibt das Verhalten unspezifiziert. Für den Fall,<br />

daß tatsächlich mehrere <strong>Threads</strong> darüber informiert werden müssen, wann ein<br />

bestimmter Thread sich beendet hat, müssen demnach andere Synchronisationspri<strong>mit</strong>iven<br />

als pthread_join() herangezogen werden.<br />

Sollte ein Programm weder am Rückgabewert eines <strong>Threads</strong> interessiert sein,<br />

z. B. weil der Thread ohnehin immer nur einen Nullzeiger zurückliefert, noch<br />

auf das Ende eines <strong>Threads</strong> warten wollen, so kann der Thread <strong>mit</strong>tels<br />

pthread_detach() entkoppelt werden. Der entkoppelte Thread wird dadurch<br />

insofern losgelöst, als daß das System beim Thread-Ende auf die Zwischenspeicherung<br />

des Rückgabewerts verzichtet <strong>und</strong> sämtliche Ressourcen des <strong>Threads</strong><br />

umgehend frei gibt. pthread_detach() erwartet als einziges Argument die<br />

Thread-ID des zu entkoppelnden <strong>Threads</strong> <strong>und</strong> gibt, wie fast alle Pthreads-<br />

Funktionen, im Erfolgsfall den Wert 0 zurück. Tritt ein Fehler auf, so gibt der<br />

Rückgabewert Auskunft über die Fehlerursache.<br />

Wird pthread_detach() für einen noch laufenden Thread aufgerufen, so verursacht<br />

die Funktion keinesfalls einen Abbruch dieses <strong>Threads</strong>, es wird lediglich<br />

notiert, daß die Umgebung nicht am Endergebnis des <strong>Threads</strong> interessiert<br />

ist. Ist der referenzierte Thread bereits beendet, so werden sein Rückgabewert<br />

verworfen <strong>und</strong> alle Ressourcen freigegeben. Insbesondere kann kein anderer<br />

Thread mehr <strong>mit</strong>tels pthread_join() auf das Ende eines zuvor entkoppelten<br />

<strong>Threads</strong> warten. Wird pthread_detach() für eine Thread-ID mehrfach<br />

ausgeführt, so ist das Verhalten explizit unspezifiziert.<br />

Beispiel 3.1 zeigt den gr<strong>und</strong>legenden Aufbau eines Programms <strong>mit</strong> mehreren<br />

<strong>Threads</strong>.<br />

1 #include <br />

2 #include <br />

3 #include <br />

4 #include <br />

5<br />

Beispiel 3.1. pthreads-lifecycle.c<br />

6 void *job( void *arg )<br />

7 {<br />

8 printf( "Thread läuft.\n" );<br />

9 sleep( 15 );<br />

10 printf( "Thread ist fertig.\n" );

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!