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

Die Ausgabe des Programms hat nun auch die ursprünglich erwartete Form:<br />

$ ./pthreads-exit2<br />

Programm läuft.<br />

Thread gestartet, Programm läuft weiter.<br />

Thread Nr. 1 läuft.<br />

Thread Nr. 2 läuft.<br />

Thread Nr. 3 läuft.<br />

Hauptthread beendet sich.<br />

Thread Nr. 1 ist fertig.<br />

Thread Nr. 2 ist fertig.<br />

Thread Nr. 3 ist fertig.<br />

Nach einem erfolgreichen Start der drei neuen <strong>Threads</strong> setzt sich der Hauptthread<br />

<strong>mit</strong> dem Aufruf von pthread_exit()selbst ein Ende. Der Thread geht<br />

da<strong>mit</strong> vom Running-Zustand in den Terminated-Zusand, ohne vorher <strong>mit</strong> der<br />

exit()-Funktion das Prozeßende herbeizuführen. Die restlichen <strong>Threads</strong> des<br />

Prozesses können währenddessen <strong>mit</strong> ihren Aufgaben fortfahren. Erst nachdem<br />

alle <strong>Threads</strong> ihre Aufgaben abgeschlossen haben, wird auch der Prozeß<br />

beendet. Der Rückgabewert des Prozesses ist in dieser Situation 0, d.h.der<br />

Prozeß verhält sich so, als hätte die Anwendung am Ende exit(0) aufgerufen.<br />

3.2 Synchronisation<br />

In den vorangegangenen Beispielen haben wir lediglich ein sehr einfaches<br />

Pthreads-Programm entwickelt. Die gestarteten <strong>Threads</strong> hatten keine ernstzunehmende<br />

Aufgabe <strong>und</strong> sie haben bislang auch nicht <strong>mit</strong>einander kooperiert,<br />

um eine gemeinsame Aufgabe zu lösen. Die wahre Stärke von Prozessen <strong>mit</strong><br />

mehreren <strong>Threads</strong> liegt aber genau in der Zusammenarbeit der <strong>Threads</strong>. Da<br />

sich alle <strong>Threads</strong> eines <strong>Unix</strong>-Prozesses den selben Adreßraum teilen, liegt es<br />

auf der Hand, die gemeinsamen Speicherbereiche auch kooperativ zu nutzen.<br />

Ohne explizit darauf hinzuweisen, haben wir dies, z. B. in Beispiel 3.2, bereits<br />

getan. Alle vier <strong>Threads</strong> haben über eine Referenz auf die Variable i der<br />

main()-Funktion zugegriffen.<br />

Die im Rahmen von Beispiel 3.2 identifizierten Race Conditions haben gezeigt,<br />

daß der Zugriff auf die gemeinsam genutzte Daten entweder zu unterbleiben<br />

hat (was zwar in Beispiel 3.3 ein probates Mittel war, was aber in der Regel<br />

sicher nicht im Sinne einer kooperativen Zusammenarbeit sein kann) oder daß<br />

der konkurrierende Zugriff auf die gemeinsamen Ressourcen synchronisiert<br />

stattfinden muß.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!