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.

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

Mutex. Nachdem er anschließend die durch den Mutex geschützten Ressourcen<br />

gelesen oder modifiziert hat, gibt der Thread den zuvor gesperrten Mutex<br />

<strong>mit</strong>tels pthread_mutex_unlock() wieder frei. Durch diesen verbindlichen<br />

Verhaltenskodex garantieren die beteiligten <strong>Threads</strong> den in Abschnitt 3.2.1<br />

geforderten gegenseitigen Ausschluß beim konkurrierenden Zugriff auf die gemeinsamen<br />

Ressourcen.<br />

Ist der an pthread_mutex_lock() übergebene Mutex zum Zeitpunkt des Aufrufs<br />

bereits von einem anderen Thread gesperrt, so blockiert die Funktion solange,<br />

bis der Mutex wieder freigegeben wurde <strong>und</strong> der aufrufende Thread den<br />

Mutex sperren konnte. Wann genau ein Thread den Zuschlag für einen Mutex<br />

erhält <strong>und</strong> da<strong>mit</strong> aus pthread_mutex_lock() zurückkehrt, ist nicht festgelegt<br />

<strong>und</strong> hängt neben der Scheduling-Strategie des Systems unter anderem<br />

auch davon ab, ob sich noch andere <strong>Threads</strong> um den selben Mutex bemühen.<br />

Davon abweichend kehrt ein Aufruf von pthread_mutex_trylock() immer<br />

sofort zurück. Die Funktion liefert den Rückgabewert EBUSY, falls der angeforderte<br />

Mutex von pthread_mutex_trylock() nicht gesperrt werden konnte,<br />

da er zum Zeitpunkt des Aufrufs bereits gesperrt war.<br />

#include<br />

<br />

int pthread_mutex_lock( pthread_mutex_t *mutex );<br />

int pthread_mutex_trylock( pthread_mutex_t *mutex );<br />

int pthread_mutex_unlock( pthread_mutex_t *mutex );<br />

Alle drei Funktionen erwarten als einziges Argument einen Zeiger auf den zu<br />

sperrenden bzw. den freizugebenden Mutex. Der Rückgabewert 0 signalisiert<br />

jeweils einen erfolgreiches Sperren bzw. Freigeben des referenzierten Mutex’,<br />

andernfalls gibt der Wert Auskunft über die Ursache des Scheiterns.<br />

Mutexe praktisch einsetzen<br />

8–12<br />

16–20<br />

Mit der Hilfe eines Mutex’ lassen sich die Race Conditions aus Beispiel 3.4<br />

beseitigen. Beispiel 3.5 zeigt die überarbeitete Version des Programms:<br />

Die Datenstruktur für den gemeinsamen Datenpuffer von Erzeuger- <strong>und</strong><br />

Verbraucher-Thread wurde um die Strukturkomponente mutex vom Typ<br />

pthread_mutex_t erweitert. Es ist in aller Regel eine gute Idee, zwischen<br />

einem Mutex <strong>und</strong> den Daten, die er schützt, einen engen Zusammenhalt herzustellen.<br />

Dies kann durch eine unmißverständliche Namensgebung geschehen,<br />

oder, wie in diesem Beispiel, durch die Zusammenfassung der beiden Komponenten<br />

in einer gemeinsamen Datenstruktur.<br />

Die Hilfsfunktion error_exit() hilft uns, die beim Aufruf der Pthreads-<br />

Funktionen anfallenden Fehlerabfragen etwas kompakter zu gestalten.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!