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.

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

für den Anwender. Für beide Unzulänglichkeiten des Programms gibt es eine<br />

passende Lösung: den Einsatz von Bedingungsvariablen.<br />

3.2.3 Bedingungsvariablen<br />

Bedingungsvariablen haben den Zweck, den Zustand gemeinsam genutzter<br />

Ressourcen zu kommunizieren. In den Beispielen 3.4 <strong>und</strong> 3.5 wären dies die<br />

beiden Zustände im Puffer sind (wieder) Daten enthalten“ bzw. im Puffer<br />

” ”<br />

ist (wieder) Platz für neue Daten“. Die beiden Zustände würden dann entsprechend<br />

der aktuellen Situation vom Erzeuger- oder Verbraucher-Thread<br />

signalisiert <strong>und</strong> der jeweils andere Thread würde bei leerem bzw. vollem Puffer<br />

auf das Eintreffen einer solchen Zustandsänderungs<strong>mit</strong>teilung warten.<br />

Das Erzeuger-/Verbraucherproblem ist ein typisches Beispiel dafür, daß <strong>mit</strong>einander<br />

kooperierende <strong>Threads</strong> nicht permanent arbeiten können, sondern<br />

von Zeit zu Zeit auf einen bestimmten Zustand der gemeinsamen Ressourcen<br />

warten müssen. Findet etwa der Verbraucher-Thread innerhalb seines<br />

kritischen Bereichs den Puffer leer vor, so muß er solange warten, bis der<br />

Erzeuger-Thread signalisiert, daß er neue Werte in den Puffer gestellt hat.<br />

Der Verbraucher-Thread wartet dazu auf eine Bedingungsvariable. Sobald<br />

der Erzeuger-Thread einen Datensatz erstellt hat, signalisiert er den von<br />

ihm veränderten Zustand über die selbe Bedingungsvariable auf die der<br />

Verbraucher-Thread wartet.<br />

Bedingungsvariablen erstellen <strong>und</strong> verwerfen<br />

Ähnlich wie eine Mutex-Variable muß auch eine Bedingungsvariable vor<br />

dem ersten Einsatz initialisiert werden. Entweder wird der Variablen vom<br />

Typ pthread_cond_t dazu bereits bei ihrer Vereinbarung die Konstante<br />

PTHREAD_COND_INITIALIZER zugewiesen, oder die Aufgabe wird über die<br />

Pthreads-Hilfsfunktion pthread_cond_init() abgewickelt. Analog zum Mutex<br />

darf auch eine Bedingungsvariable nur einmal initialisiert werden. Wird<br />

pthread_cond_init() auf eine bereits initialisierte Variable angewandt, so<br />

ist das Verhalten der Funktion <strong>und</strong>efiniert.<br />

#include<br />

<br />

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;<br />

int pthread_cond_init( pthread_cond_t *cond,<br />

const pthread_condattr_t *attr );<br />

int pthread_cond_destroy( pthread_cond_t *cond );

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!