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.

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

15–19<br />

21–29<br />

31–41<br />

43–44<br />

Im Hauptprogramm werden als erstes die benötigten Variablen vereinbart.<br />

Die Variable tid vom Typ pthread_t dient zur Aufbewahrung der Thread-<br />

ID, im void-Zeiger wird später der Rückgabewert des <strong>Threads</strong> gespeichert<br />

<strong>und</strong> die int-Variable status dient als Zwischenspeicher für die Statuswerte<br />

der Pthreads-Funktionen.<br />

Nach einer Kontrollausgabe wird die Startfunktion job als neuer Pthread<br />

gestartet. Der neue Thread wird von pthread_create() <strong>mit</strong> den Standardattributen<br />

versehen <strong>und</strong> bekommt als Argument einen Nullzeiger übergeben, die<br />

neue Thread-ID wird dann in der Variablen tid gespeichert. Sollte beim Start<br />

des Thread ein Fehler auftreten, wird das Programm nach einer entsprechenden<br />

Fehlermeldung abgebrochen.<br />

Anschließend legt sich das Programm für fünf Sek<strong>und</strong>en schlafen, ehe es nach<br />

dieser kleinen Kunstpause den zuvor gestarteten Thread einfängt, d.ḣ auf<br />

dessen Ende wartet. Dazu wird der Funktion pthread_join() die passende<br />

Thread-ID <strong>und</strong> der Speicherort für den Rückgabewert übergeben. Auch hier<br />

wird das Programm umgehend <strong>mit</strong> einer adäquaten Fehlermeldung beendet,<br />

sollte wider Erwarten ein Fehler auftreten. Anstelle der Adresse der Variablen<br />

result hätten wir in diesem Beispiel genausogut einen Nullzeiger übergeben<br />

können, da wir am Rückgabewert des eingefangenen <strong>Threads</strong> ohnehin nicht<br />

interessiert sind. (Wir wissen ja schon, daß in diesem Beispiel immer nur der<br />

Wert NULL geliefert wird.)<br />

Zum Schluß beendet sich das Programm nach einer weiteren Kontrollausgabe.<br />

Ein Testlauf des Programms liefert das erwartete Ergebnis: Zunächst meldet<br />

sich das Hauptprogramm <strong>mit</strong> seiner Begrüßung Programm läuft“. Anschließend<br />

wird ein neuer Thread gestartet, das Hauptprogramm meldet dies durch<br />

”<br />

seine zweite Kontrollausgabe <strong>und</strong> legt sich danach für kurze Zeit schlafen. In<br />

dieser Zeit kommt der neue, asynchron laufende Thread zum Zug <strong>und</strong> meldet<br />

sich <strong>mit</strong> Thread läuft“. Diese Ausgabe hätte, je nach Scheduling <strong>und</strong><br />

”<br />

Pufferung der Ausgabe, prinzipiell auch schon vor der zweiten Kontrollausgabe<br />

des Hauptprogramms erscheinen können. Anschließend wacht zunächst<br />

das Hauptprogramm wieder auf <strong>und</strong> wartet dann auf das Ende des zweiten<br />

<strong>Threads</strong>. Nachdem dieser seine Kunstpause absolviert <strong>und</strong> sich beendet hat,<br />

terminiert auch das Hauptprogramm.<br />

$ ./pthreads-lifecycle<br />

Programm läuft.<br />

Thread gestartet, Programm läuft weiter.<br />

Thread läuft.<br />

Programm wartet auf Thread.<br />

Thread ist fertig.<br />

Programm beendet sich.<br />

Beispiel 3.1 zeigt da<strong>mit</strong> sehr schön die vier verschiedenen Zustände, die ein<br />

Thread annehmen <strong>und</strong> zwischen denen er wechseln kann:

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!