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.

104 3 Programmieren <strong>mit</strong> POSIX-<strong>Threads</strong><br />

on angeeignet hat, sollte nach etwas Einarbeitungszeit auch <strong>mit</strong> alternativen<br />

Thread-Paketen blendend zurecht kommen.<br />

3.1 Gr<strong>und</strong>lagen<br />

Innerhalb eines Programms wird ein Pthread immer durch eine sogenannte<br />

Thread-ID referenziert. IEEE Std 1003.1-2001 definiert dafür den opaquen<br />

Datentyp pthread_t. Die Funktion pthread_create(), <strong>mit</strong> deren Hilfe ein<br />

neuer Thread gestartet wird, liefert diese ID bei einem erfolgreichen Start im<br />

Parameter thread zurück. Der neue Thread selbst ist nichts anderes als eine<br />

Funktion <strong>mit</strong> festgelegter Signatur, die von pthread_create() gestartet wird<br />

<strong>und</strong> dann als eine Art main()-Funktion des erstellten <strong>Threads</strong> abläuft. Diese<br />

Startfunktion des neuen <strong>Threads</strong> erwartet einen Zeiger vom Typ void * als<br />

Parameter <strong>und</strong> liefert am Ende einen Zeiger vom gleichen Typ als Rückgabewert<br />

zurück. Konnte der neue Thread erfolgreich gestartet werden, so liefert<br />

pthread_create() den Statuswert 0 zurück, andernfalls gibt der Rückgabewert<br />

Aufschluß über die Fehlerursache.<br />

Jeder neue Thread teilt sich <strong>mit</strong> seinen Kollegen die Betriebs<strong>mit</strong>tel des umgebenden<br />

des Prozesses, vgl. dazu Abschnitt 2.1.4. Das sind insbesondere die<br />

Code- <strong>und</strong> Datenbereiche sowie die Tabelle der Dateideskriptoren <strong>und</strong> die Abrechnungsdaten<br />

für den Prozeß. Allerdings wird für jeden Thread ein eigener<br />

Befehlszähler, eigener Registersatz <strong>und</strong> ein eigenständiger Stack verwaltet.<br />

Einem frisch gestarteten Thread können über pthread_create() gleich von<br />

Beginn an einige threadspezifische Attribute <strong>mit</strong>gegeben werden, die wir an<br />

dieser Stelle aber noch nicht besprechen. In den meisten Fällen reicht ein<br />

Nullzeiger für den Parameter attr völlig aus. In diesem Fall erhält der Thread<br />

beim Start die Pthreads-Standardattribute zugewiesen.<br />

Über die Funktion pthread_self() kann ein Thread seine eigene Thread-ID<br />

er<strong>mit</strong>teln. Die Funktion ist da<strong>mit</strong> das Pthreads-Äquivalent zur getpid()-<br />

Funktion für Prozesse. In beiden Fällen kann der neue Thread bzw. Prozeß<br />

seine eigene ID herausfinden, die er beim Start nicht <strong>mit</strong>geteilt bekommen hat.<br />

Neben pthread_create() ist pthread_self() übrigens die einzige Funktion,<br />

<strong>mit</strong> der die ID eines <strong>Threads</strong> er<strong>mit</strong>telt werden kann. Wenn der Erzeuger eines<br />

neuen <strong>Threads</strong> dessen Thread-ID verwirft, kann nur der neue Thread selbst<br />

seine eigene ID über pthread_self() herausfinden. Es gibt bei Pthreads keine<br />

Möglichkeit, die Thread-ID eines beliebigen anderen <strong>Threads</strong> zu er<strong>mit</strong>teln.<br />

Da der Datentyp für Thread-IDs opaque ist, lassen sich zwei Variablen vom<br />

Typ pthread_t nicht auf direktem Weg <strong>mit</strong>einander vergleichen. Je nach Implementierung<br />

kann pthread_t z. B. eine Struktur sein, <strong>und</strong> für Strukturen<br />

steht in ANSI/ISO C keine Vergleichsoperation zur Verfügung. Um dennoch<br />

zwei Thread-IDs auf Gleichheit prüfenzukönnen, stellt der POSIX-Standard<br />

die Funktion pthread_equal() bereit. Referenzieren die Parameter t1 <strong>und</strong>

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!