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.3 Pthreads <strong>und</strong> <strong>Unix</strong>-Prozesse<br />

3.3 Pthreads <strong>und</strong> <strong>Unix</strong>-Prozesse 135<br />

Die Erweiterung bzw. die Verfeinerung des <strong>Unix</strong>-Prozeßmodells durch POSIX-<br />

<strong>Threads</strong> hat zu einer Reihe von Anpassungen am vorausgehenden Standard<br />

IEEE Std 1003.1-1990 geführt. Während einige Problemfälle <strong>mit</strong>samt ihren<br />

Lösungen auf der Hand liegen, gab es an anderen Stellen eine ganze Menge<br />

Diskussionsbedarf <strong>mit</strong> zum Teil entsprechend diffizilen Ergebnissen. Die folgenden<br />

Abschnitte geben einen Überblick, wie sich Pthreads-Programme <strong>mit</strong><br />

den klassischen <strong>Unix</strong>-Konzepten vereinbaren lassen <strong>und</strong> was es dabei aus der<br />

Sicht der systemnahen Programmierung besonders zu beachten gilt.<br />

3.3.1 <strong>Threads</strong>ichere <strong>und</strong> eintrittsinvariante Funktionen<br />

Sowohl ANSI/ISO C als auch der POSIX-Standard wurden ursprünglich vor<br />

dem Hintergr<strong>und</strong> der klassischen Prozesse <strong>mit</strong> nur einem einzigen Kontrollfluß<br />

entwickelt. Mit der Einführung der POSIX-<strong>Threads</strong> stellte sich demnach<br />

die Frage, ob alle Funktionen <strong>und</strong> Systemaufrufe dieser Standards gefahrlos<br />

in Pthreads-Programmen eingesetzt werden können, oder ob dadurch Race<br />

Conditions verursacht werden. In der Diskussion unterscheidet man dabei die<br />

folgenden beiden Konzepte:<br />

<strong>Threads</strong>icherheit: Eine Funktion heißt laut IEEE Std 1003.1-2001 threadsicher<br />

oder thread-safe, wenn sie von mehreren <strong>Threads</strong> nebenläufig aufgerufen<br />

werden kann, ohne dabei Schaden anzurichten.<br />

<strong>Threads</strong>ichere Funktionen müssen selbst dann korrekt arbeiten, wenn der<br />

Code der Funktion von mehreren <strong>Threads</strong> ausgeführt wird. Die nebenläufigen<br />

Aufrufe der Funktion dürfen sich hierbei gegenseitig nicht negativ<br />

beeinflussen, also insbesondere keine Race Conditions heraufbeschwören. 5<br />

Im Allgemeinen wird dies durch gegenseitigen Ausschluß (beim Zugriff auf<br />

gemeinsame Ressourcen), threadspezifische Daten oder durch eintrittsinvarianten<br />

Programmcode erreicht.<br />

Eintrittsinvarianz: Eine Funktion heißt laut IEEE Std 1003.1-2001 eintrittsinvariant<br />

oder reentrant, wenn das Ergebnis jeder beliebigen, nebenläufigen<br />

Ausführung durch mehrere <strong>Threads</strong> das gleiche ist, wie wenn die beteiligten<br />

<strong>Threads</strong> die Funktion jeweils einer nach dem anderen (in einer<br />

nicht festgelegten Reihenfolge) ausgeführt hätten.<br />

Eintrittsinvariante Funktionen greifen nur auf ihre eigenen lokalen Variablen<br />

zu, hängen ausschließlich von den übergebenen Parametern ab <strong>und</strong><br />

rufen selbst nur Funktionen <strong>mit</strong> identischen Eigenschaften auf. Eine eintrittsinvariante<br />

Funktion besitzt da<strong>mit</strong> keine implizite Abhängigkeit von<br />

5 <strong>Threads</strong>icherheit sagt im Übrigen nichts über die Effizienz aus, <strong>mit</strong> der der threadsichere<br />

Code ausgeführt wird.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!