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.

416 A Anhang<br />

auf Null gezählt hat, können alle wartenden <strong>Threads</strong> die Sperre wieder verlassen.<br />

Gleichzeitig wird der Zähler wieder auf den ursprünglichen Wert gesetzt,<br />

da<strong>mit</strong> die Barriere sofort wieder von neuem eingesetzt werden kann. Nachdem<br />

die verschiedenen Attribute einer Barriere von mehreren <strong>Threads</strong> nebenläufig<br />

ausgewertet werden, muß der Zugriff auf diese gemeinsam genutzten Werte<br />

koordiniert erfolgen, was durch Mutexe <strong>und</strong> Bedingungsvariablen realisiert<br />

werden kann. Die nachfolgend diskutierte Barrieren-Implementierung ist von<br />

den POSIX-Definitionen für Barrieren inspiriert. 8<br />

Beispiel A.1 zeigt den Aufbau der Datenstruktur barrier_t sowie die Prototypen<br />

der drei Barrieren-Funktionen barrier_init(), barrier_destroy()<br />

<strong>und</strong> barrier_wait():<br />

1 #ifndef BARRIER_H<br />

2 #define BARRIER_H<br />

Beispiel A.1. barrier.h<br />

3<br />

4 #include <br />

5<br />

6 typedef struct barrier<br />

7 {<br />

8 /* Zugriff auf Barriere via Mutex serialisieren */<br />

9 pthread_mutex_t mutex;<br />

10 /* Zustandsänderungen über Bedingungsvariable anzeigen */<br />

11 pthread_cond_t cv;<br />

12 /* Schwellwert für wartende <strong>Threads</strong> (Soll-Stand) */<br />

13 int threshold;<br />

14 /* Anzahl aktuell wartender <strong>Threads</strong> (Ist-Stand) */<br />

15 int counter;<br />

16 /* Die eigentliche Wartebedingung */<br />

17 unsigned long cycle;<br />

18 } barrier_t;<br />

19<br />

20 #define BARRIER_SERIAL_THREAD -2<br />

21<br />

22 int barrier_init( barrier_t *barrier , unsigned count );<br />

23 int barrier_destroy( barrier_t *barrier );<br />

24 int barrier_wait( barrier_t *barrier );<br />

25<br />

26 #endif<br />

6–18<br />

Der synchronisierte Zugriff auf die Attribute der Barriere wird über den Mutex<br />

mutex <strong>und</strong> die Bedingungsvariable cv gewährleistet. Der threshold-Wert<br />

8 In IEEE Std 1003.1-2001 ist die Unterstützung von Barrieren lediglich als optional<br />

gekennzeichnet.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!