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.

420 A Anhang<br />

69 barrier ->cycle++;<br />

70 barrier ->counter = barrier ->threshold;<br />

71<br />

72 status = pthread_cond_broadcast( &barrier ->cv );<br />

73 if( status == 0 )<br />

74 status = BARRIER_SERIAL_THREAD;<br />

75 }<br />

76 else<br />

77 {<br />

78 /* Falls nein, auf weitere <strong>Threads</strong> warten */<br />

79 while( cycle == barrier ->cycle )<br />

80 {<br />

81 status = pthread_cond_wait( &barrier ->cv,<br />

82 &barrier ->mutex );<br />

83 if( status != 0 )<br />

84 break;<br />

85 }<br />

86 }<br />

87<br />

88 pthread_mutex_unlock( &barrier ->mutex );<br />

89 return( status );<br />

90 }<br />

55–63<br />

65–75<br />

76–86<br />

Die barrier_wait()-Funktion ist das Herzstück der Implementierung. Die<br />

Funktion sichert sich zunächst den exklusiven Zugriff auf die Barriere <strong>und</strong><br />

merkt sich dann in der lokalen Hilfsvariablen cycle den aktuellen Wert des<br />

Durchlaufzählers der übergebenen Barriere. Anhand dieses Zählers kann die<br />

Funktion später feststellen, ob sie die Barriere wieder verlassen darf.<br />

Anschließend dekrementiert barrier_wait() den Zähler counter <strong>und</strong> prüft,<br />

ob zusammen <strong>mit</strong> dem aktuellen Thread die erforderliche Anzahl von <strong>Threads</strong><br />

die referenzierte Barriere erreicht hat. Ist dies der Fall, so gilt counter == 0.<br />

In diesem Fall inkrementiert barrier_wait() den Durchlaufzähler der Barriere<br />

<strong>und</strong> setzt den Zähler counter wieder auf den bei der Initialisierung<br />

festgelegten Wert threshold. Derveränderte Zustand der Barriere wird den<br />

anderen an dieser Sperre wartenden <strong>Threads</strong> über einen Broadcast auf der<br />

Bedingungsvariablen cv signalisiert. Im Erfolgsfall erhält der aktuelle Thread<br />

den Rückgabewert BARRIER_SERIAL_THREAD.<br />

Sind noch nicht genügend <strong>Threads</strong> an der Sperre angelangt, so reiht sich<br />

der aktuelle Thread in die Menge der wartenden <strong>Threads</strong> ein. Der Thread<br />

verläßt die Warteschleife erst dann, wenn von einem anderen Thread der<br />

Durchlaufzähler der Barriere erhöht wurde <strong>und</strong> da<strong>mit</strong> vom zuvor gemerkten<br />

ursprünglichen Wert abweicht. Während barrier_wait() auf dieses Ereignis<br />

wartet, wird der exklusive Zugriff auf die Barriere vorübergehend freigegeben.<br />

Sollte in der pthread_cond_wait()-Funktion ein Fehler auftreten, so wird die<br />

Warteschleife vorzeitig abgebrochen.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!