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 121<br />

Bevor ein Mutex eingesetzt werden kann, muß zunächst die Mutex-Variable<br />

initialisiert <strong>und</strong> der Mutex da<strong>mit</strong> erzeugt werden. Der POSIX-Standard für<br />

<strong>Threads</strong> hält hierfür die Funktion pthread_mutex_init() bereit. Die Funktion<br />

erwartet als Parameter einen Zeiger auf die zu initialisierende Mutex-<br />

Variable sowie einen Zeiger auf eventuelle Mutex-Attribute. Im Normalfall<br />

genügt für die Attribute ein Nullzeiger, um einen Mutex <strong>mit</strong> Standardattributen<br />

zu erzeugen. Die Funktion liefert wie üblich einen Statuswert, der über<br />

den Ausgang der Operation Auskunft gibt. Ist der Rückgabewert gleich 0, so<br />

war die Initialisierung erfolgreich.<br />

#include<br />

<br />

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;<br />

int pthread_mutex_init( pthread_mutex_t *mutex ,<br />

const pthread_mutexattr_t *attr );<br />

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

Eleganter kann eine Mutex-Variable initialisiert werden, indem ihr bereits bei<br />

der Vereinbarung der Initialwert PTHREAD_MUTEX_INITIALIZER zugewiesen<br />

wird. Der neue Mutex erhält dabei die Mutex-Standardattribute. Ein Aufruf<br />

von pthread_mutex_init() <strong>mit</strong>samt der obligatorischen Fehlerabfrage<br />

entfällt in diesem Fall. Wird pthread_mutex_init() auf eine bereits initialisierte<br />

Mutex-Variable angewandt, so ist das Verhalten explizit unspezifiziert.<br />

Übrigens handelt es sich auch bei einem Mutex um einen opaquen Datentyp,<br />

<strong>mit</strong> dem nur über die angebotenen Mutex-Funktionen gearbeitet werden darf.<br />

Es ist explizit nicht erlaubt, eine Variable vom Typ pthread_mutex_t zu<br />

kopieren <strong>und</strong> im weiteren Verlauf des Programms eine Referenz auf diese<br />

Kopie an eine der Mutex-Funktionen zu übergeben.<br />

Mittels pthread_mutex_destroy() wird schließlich ein nicht mehr benötigter<br />

Mutex wieder verworfen. Ein Mutex sollte genau dann entsorgt werden,<br />

wenn er in Zukunft nicht mehr zur Synchronisation eingesetzt wird. Natürlich<br />

darf der Mutex in diesem Moment nicht mehr gesperrt sein <strong>und</strong> es darf<br />

auch kein Thread mehr auf eine Zuteilung des Mutex’ warten. Die Mutex-<br />

Variable erhält durch pthread_mutex_destroy() den Status nicht initialisiert.<br />

Selbstverständlich ist es legitim, die Variable später erneut zu initialisieren<br />

<strong>und</strong> im Anschluß wieder zu verwenden. Ist der Rückgabewert von<br />

pthread_mutex_destroy() gleich 0, so war die Operation erfolgreich, andernfalls<br />

gibt der Statuswert Auskunft über die genaue Fehlerursache.<br />

Mutexe sperren <strong>und</strong> wieder freigeben<br />

Bevor nun ein Thread in seinen kritischen Bereich eintritt, sperrt er <strong>mit</strong><br />

pthread_mutex_lock() oder pthread_mutex_trylock() den zugehörigen

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!