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.

3.2 Synchronisation 127<br />

Mittels pthread_cond_destroy() wird eine Bedingungsvariable wieder verworfen.<br />

Auch hier gilt, daß eine Bedingungsvariable nur dann entsorgt werden<br />

darf, wenn die Variable im weiteren Programmverlauf nicht mehr zur<br />

Synchronisation verwendet wird <strong>und</strong> außerdem kein Thread mehr auf diese<br />

Variable wartet. Die pthread_cond_destroy()-Funktion setzt den Zustand<br />

der Variablen auf nicht initialisiert. Selbstverständlich kann eine verworfene<br />

Bedingungsvariable anschließend wieder neu initialisiert werden. Jede andere<br />

Operation auf einer nicht initialisierten (oder verworfenen) Bedingungsvariablen<br />

sind explizit <strong>und</strong>efiniert.<br />

Im Allgemeinen werden Bedingungsvariablen als externe Variablen, d. h. vor<br />

<strong>und</strong> außerhalb der Funktionsdefinitionen eines Programms, vereinbart, vor<br />

dem Start der ersten <strong>Threads</strong> initialisiert <strong>und</strong> erst am Programmende wieder<br />

verworfen. Wie bei opaquen Datentypen üblich, darf nicht auf Kopien dieser<br />

Variablen gearbeitet werden.<br />

Die beiden Funktionen pthread_cond_init() <strong>und</strong> pthread_cond_destroy()<br />

liefern jeweils den Rückgabewert 0, wenn ihr Aufruf erfolgreich war. Andernfalls<br />

zeigt der Wert die Ursache des aufgetretenen Fehlers an.<br />

Auf Bedingungsvariablen warten<br />

Das Warten auf eine Bedingungsvariable ist immer <strong>mit</strong> der expliziten Auswertung<br />

einer Bedingung verknüpft. Diese Bedingungen sind logische Ausdrücke,<br />

die den Zustand einer gemeinsam genutzten Ressource beschreiben. Auf<br />

Deutsch würde man eine solche Bedingung wie folgt formulieren: Die Warteschlange<br />

ist leer“, der Puffer ist voll“ oder die Ressource ist verfügbar“.<br />

” ”<br />

”<br />

Prüft ein Thread eine Bedingung, so greift er dazu zwangsweise auf gemeinsam<br />

genutzte Daten zu, weshalb dieser Schritt innerhalb eines, durch einen<br />

Mutex geschützten, kritischen Bereichs erfolgen muß.<br />

Je nach Ergebnis der Auswertung wartet der Thread nun entweder bis der<br />

Zustand verändert wurde, oder er fährt innerhalb seines kritischen Bereichs<br />

<strong>mit</strong> seinen Arbeiten fort. Sollte der Thread auf einen bestimmten Zustand der<br />

gemeinsam genutzten Ressource warten müssen, so muß er beim Eintritt in die<br />

Wartephase gleichzeitig seinen kritischen Bereich verlassen, also den schützenden<br />

Mutex freigeben. Andernfalls hätte kein anderer Thread die Möglichkeit,<br />

den eigenen kritischen Bereich zu betreten, dort die gemeinsamen Daten zu<br />

bearbeiten <strong>und</strong> anschließend den veränderten Zustand zu signalisieren. In der<br />

Konsequenz sind Bedingungsvariablen immer an einen Mutex geknüpft.<br />

Mit der pthread_cond_wait()-Funktion verläßt ein Thread seinen kritischen<br />

Bereich, welcher durch den Mutex mutex geschützt wird, <strong>und</strong> wartet auf die<br />

Bedingungsvariable cond. Die Funktion gibt dazu implizit den <strong>mit</strong> der Bedingungsvariablen<br />

assoziierten Mutex mutex frei. Der Thread befindet sich

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!