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

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

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

als erstes ihre Bedingung neu auswerten. Die Umkehrrichtung ist dagegen<br />

nicht richtig: Ein Broadcast kann nicht in jedem Fall durch einen Aufruf von<br />

pthread_cond_signal() ersetzt werden.<br />

Anders als beim Warten auf eine Bedingungsvariable muß ein Thread, der<br />

eine Bedingungsvariable signalisiert, zu diesem Zeitpunkt nicht in seinem kritischen<br />

Bereich sein. D. h. der signalisierende Thread muß den Mutex, den<br />

die wartenden <strong>Threads</strong> <strong>mit</strong> der Bedingungsvariable assoziiert haben, beim<br />

Aufruf von pthread_cond_broadcast() bzw. pthread_cond_signal() nicht<br />

gesperrt haben.<br />

Übrigens steht die in diesem Abschnitt verwendete Terminologie signalisieren<br />

in keinem Zusammenhang <strong>mit</strong> dem in Abschnitt 2.4 eingeführten Signal-<br />

Konzept für <strong>Unix</strong>-Prozesse. Was in Pthreads-Programmen zu beachten ist,<br />

wenn im Rahmen der System- <strong>und</strong> Netzwerkprogrammierung <strong>Unix</strong>-Signale<br />

ins Spiel kommen, diskutieren wir in Abschnitt 3.3.3.<br />

Mutexe <strong>und</strong> Bedingungsvariablen einsetzen<br />

9–14<br />

31–42<br />

Wir nutzen nun die Möglichkeiten der Bedingungsvariablen, um eine finale<br />

Version unseres Erzeuger-/Verbraucher-Programms zu erstellen. Die neue Variante<br />

aus den Beispielen 3.6 <strong>und</strong> 3.7 arbeitet <strong>mit</strong> einem Erzeuger-Thread <strong>und</strong><br />

zwei Verbraucher-<strong>Threads</strong>.<br />

Die gemeinsame Datenstruktur wurde nochmals um zwei Komponenten vom<br />

Typ pthread_cond_t erweitert. Die Bedingungsvariable add wird vom Programm<br />

eingesetzt, um auf neue Elemente im Datenpuffer zu warten bzw. diese<br />

zu signalisieren. Die zweite Bedingungsvariable rem hat die Aufgabe, die Entnahme<br />

von Elementen aus dem Puffer zu kommunizieren.<br />

Nachdem ein Verbraucher innerhalb der Endlosschleife seinen kritischen Bereich<br />

betreten hat, prüft er als erstes in einer Schleife, ob im gemeinsamen<br />

Datenpuffer Elemente zur Verarbeitung bereit stehen. Sollte der Puffer leer<br />

sein, so wartet der Verbraucher-Thread auf frische Ware. Er setzt dazu die Bedingungsvariable<br />

data.add ein, über die vom Erzeuger neue Elemente im Puffer<br />

angezeigt werden. Gleichzeitig <strong>mit</strong> dem Aufruf von pthread_cond_wait()<br />

verläßt der Thread implizit seinen kritischen Bereich <strong>und</strong> gibt den schützenden<br />

Mutex data.mutex frei. Sobald der Verbraucher-Thread wieder erwacht<br />

<strong>und</strong> aus der pthread_cond_wait()-Funktion zurückkehrt, ist er wieder im<br />

Besitz des Mutex’ <strong>und</strong> befindet sich da<strong>mit</strong> wieder in seinem kritischen Bereich.<br />

Durch die Schleife wird als erstes erneut die Bedingung liegen Daten<br />

”<br />

im Puffer bereit“ geprüft <strong>und</strong> nur bei entsprechendem Ausgang verläßt der<br />

Thread die Schleife <strong>und</strong> fährt <strong>mit</strong> der weiteren Verarbeitung der Daten fort.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!