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.

3.2 Synchronisation 129<br />

legt jedoch zusätzlich einen festen Endtermin für die Wartephase fest. Erreicht<br />

oder überschreitet die Systemzeit den angegebenen Zeitpunkt, so kehrt<br />

die Funktion zurück (nachdem sie zuvor den referenzierten Mutex wieder gesperrt<br />

<strong>und</strong> der Thread da<strong>mit</strong> den kritischen Bereich wieder betreten hat).<br />

Beide Funktionen zeigen eine erfolgreiche Ausführung durch den Rückgabewert<br />

0 an, ein Wert ungleich Null gibt Auskunft über den aufgetretenen Fehler.<br />

pthread_cond_timedwait() liefert den Wert ETIMEDOUT zurück, wenn die<br />

Bedingungsvariable innerhalb der vorgegebenen Zeit nicht signalisiert wurde.<br />

Bedingungsvariablen signalisieren<br />

Hat ein Thread innerhalb seines kritischen Bereichs den Zustand gemeinsam<br />

genutzter Ressourcen verändert, wird er anschließend mindestens einen der<br />

auf eine Änderung wartenden <strong>Threads</strong> <strong>mit</strong> Hilfe einer Bedingungsvariablen<br />

über dieses Ereignis informieren wollen. Diese Aufgabe übernehmen die beiden<br />

Funktionen pthread_cond_broadcast() <strong>und</strong> pthread_cond_signal().<br />

#include<br />

<br />

int pthread_cond_broadcast( pthread_cond_t *cond );<br />

int pthread_cond_signal( pthread_cond_t *cond );<br />

Beide Funktionen akzeptieren eine zuvor initialisierte Bedingungsvariable als<br />

Parameter. Während pthread_cond_broadcast() in einer Art R<strong>und</strong>ruf alle<br />

<strong>Threads</strong> aufweckt, die momentan auf die signalisierte Bedingungsvariable warten,<br />

weckt pthread_cond_signal() nur (mindestens) einen Thread aus seiner<br />

Wartephase. 3 Wartet zum Zeitpunkt des Weckrufs überhaupt kein Thread<br />

auf die signalisierte Bedingungsvariable, so verpufft die Mitteilung ungehört.<br />

Spätere Aufrufe von pthread_cond_wait() oder pthread_cond_timedwait()<br />

wissen also nichts von diesem verhallten Weckruf <strong>und</strong> blockieren wie gewohnt.<br />

Wir können uns die pthread_cond_signal()-Funktion als Spezialform von<br />

pthread_cond_broadcast() denken. Bei sorgfältiger Programmierung kann<br />

anstatt pthread_cond_signal() generell immer der Broadcast gewählt werden.<br />

Der wesentliche Unterschied der beiden Varianten besteht in der Effizienz,<br />

denn pthread_cond_broadcast() weckt in aller Regel mehr <strong>Threads</strong><br />

auf, als pthread_cond_signal(). Was den Algorithmus anbetrifft, ist dies<br />

nicht weiter von Bedeutung, solange die <strong>Threads</strong> in ihrem kritischen Bereich<br />

3 Auf Multiprozessorsystemen kann es in der Praxis nicht oder nur <strong>mit</strong> Leistungseinbußen<br />

zu realisieren sein, daß von pthread_cond_signal() genau ein Thread<br />

aufgeweckt wird. In IEEE Std 1003.1-2001 ist deshalb explizit festgehalten, daß<br />

durch diese Funktion auch mehrere <strong>Threads</strong>, aber eben mindestens einer, geweckt<br />

werden können.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!