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.

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

danach im Blocked-Zustand (siehe dazu Abschnitt 3.1). 2 Erst wenn ein anderer<br />

Thread über die selbe Bedingungsvariable cond eine Veränderung der<br />

gemeinsam genutzten Daten signalisiert, kann der wartende Thread wieder<br />

zum Zug kommen. Allerdings muß sich der Thread vor einer Rückkehr aus<br />

dem pthread_cond_wait()-Aufruf wieder erfolgreich um den Mutex mutex<br />

bemühen <strong>und</strong> das System muß ihm natürlich wieder CPU-Zeit zuweisen.<br />

#include<br />

<br />

int pthread_cond_wait( pthread_cond_t *cond,<br />

pthread_mutex_t *mutex );<br />

int pthread_cond_timedwait( pthread_cond_t *cond,<br />

pthread_mutex_t *mutex ,<br />

const struct timespec *abstime );<br />

Kehrt ein Thread aus pthread_cond_wait() zurück, so befindet er sich automatisch<br />

wieder in seinem kritischen Bereich <strong>und</strong> kann <strong>mit</strong> den Arbeiten<br />

fortfahren. Da eine Rückkehr aus der pthread_cond_wait()-Funktion keine<br />

Aussage darüber trifft, ob die erwartete Bedingung nun erfüllt ist, muß<br />

der Thread nun als erstes erneut prüfen, ob sich der gewünschte Zustand<br />

der gemeinsamen Ressourcen eingestellt hat, ob also tatsächlich die Bedingung<br />

für eine Fortsetzung seiner Arbeiten erfüllt ist. Es ist nämlich durchaus<br />

denkbar, daß zwischen der Mitteilung über die Zustandsänderung <strong>und</strong> dem<br />

erfolgreichen Bemühen um den schützenden Mutex bereits ein anderer Thread<br />

seinen kritischen Bereich betreten <strong>und</strong> darin die gemeinsamen Daten erneut<br />

verändert hat. Nachdem nun also sowohl vor als auch nach einem Aufruf<br />

von pthread_cond_wait() geprüft werden muß, ob die erwartete Bedingung<br />

erfüllt ist, packt man die Funktion im Normalfall in eine while-Schleife.<br />

Die feste Bindung einer Bedingungsvariablen an einen Mutex impliziert, daß<br />

niemals zwei <strong>Threads</strong> gleichzeitig auf die selbe Bedingungsvariable warten<br />

<strong>und</strong> dabei zwei unterschiedliche Mutexe einsetzen dürfen. Jeder Bedingungsvariablen<br />

muß gemäß POSIX-Standard zu jedem Zeitpunkt genau ein Mutex<br />

zugeordnet sein. Umgekehrt dürfen einem Mutex sehr wohl mehrere Bedingungsvariablen<br />

zugeordnet werden. Bildlich gesprochen kann ein Mutex also<br />

mehrere Bedingungen schützen, während eine Bedingung immer vom selben<br />

Mutex geschützt werden muß.<br />

Soll ein Thread nicht beliebig lange auf eine Bedingungsvariable warten<br />

müssen, so steht alternativ die Funktion pthread_cond_timedwait() bereit.<br />

Sie ist äquivalent zu pthread_cond_wait(), wartet auf eine Bedingungsvariable<br />

<strong>und</strong> verläßt dabei implizit den kritischen Bereich. Der Parameter abstime<br />

2 Die Freigabe des Mutex <strong>und</strong> der Eintritt in den Blocked-Zustand werden zu einer<br />

atomaren Operation zusammengeschweißt. Sollte also ein zweiter Thread den<br />

Mutex sperren <strong>und</strong> eine Zustandsveränderung signalisieren, so kann der ursprüngliche<br />

Thread bereits wieder aus seiner Wartephase geweckt werden.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!