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.

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

Der Thread bleibt solange im Terminated-Zusatnd, bis der Rückgabewert<br />

des <strong>Threads</strong> <strong>mit</strong> pthread_join() abgefragt oder <strong>mit</strong> pthread_detach()<br />

verworfen wurde. Analog zu einem Zombie-Prozeß befindet sich der Thread<br />

da<strong>mit</strong> in einem Zustand, in dem er zwar noch immer existiert, aber eben<br />

nicht mehr lebt“, weshalb man auch hier von einem Zombie-Thread sprechen<br />

kann. Als Minimum müssen vom System für diesen Thread noch seine<br />

”<br />

Thread-ID <strong>und</strong> sein Rückgabewert vorgehalten werden.<br />

Der Kontext des <strong>Threads</strong> im Terminated-Zustand, insbesondere der von<br />

ihm belegte Stack, kann aber bereits jetzt einem Recyclingvorgang zugeführt<br />

werden. Dies hat zur Konsequenz, daß der Rückgabewert eines<br />

<strong>Threads</strong> niemals lokale Variablem bzw. Adressen aus dem Stackbereich<br />

des beendeten <strong>Threads</strong> referenzieren darf.<br />

Der main()-Funktion eines Pthreads-Programms kommt im Konzept der<br />

POSIX-<strong>Threads</strong> eine eigene Rolle zu. Beim Start des Programms besitzt<br />

der neue Prozeß genau einen ausgezeichneten Thread, den Hauptthread, welcher<br />

zunächst den C-Startup-Code durchläuft (vgl. dazu Abschnitt 2.1.5) <strong>und</strong><br />

schließlich die Startfunktion des Programms, also die main()-Funktion, aufruft.<br />

Kehrt die main()-Funktion zurück, so wird vom Hauptthread entsprechend<br />

der <strong>Unix</strong>-Prozeßkonvention die exit()-Funktion aufgerufen. Selbstverständlich<br />

hat die exit()-Funktion auch in einem Prozeß <strong>mit</strong> mehreren<br />

<strong>Threads</strong> die Eigenschaft, den Prozeß umgehend zu beenden. Dieser Schritt<br />

erfolgt unabhängig davon, ob in diesem Moment noch weitere <strong>Threads</strong> aktiv<br />

sind, oder nicht.<br />

Beispiel 3.2 illustriert die Auswirkungen dieses Verhaltens <strong>und</strong> enthält, obwohl<br />

im Vergleich zum Quellcode aus Beispiel 3.1 kaum verändert, gleich mehrere<br />

heimtückische Fehler. Wir werden diese Schwachstellen im Anschluß aufdecken<br />

<strong>und</strong> ausführlich besprechen, denn in echten Programmen gilt es, derartige<br />

Fehler unbedingt zu vermeiden.<br />

1 #include <br />

2 #include <br />

3 #include <br />

4 #include <br />

5<br />

6 #define NUM_THREADS 3<br />

Beispiel 3.2. pthreads-exit1.c<br />

7<br />

8 void *job( void *arg )<br />

9 {<br />

10 int *num = arg; /* übergebenen Parameter verwerten */<br />

11<br />

12 printf( "Thread Nr. %d läuft.\n", *num );<br />

13 sleep( 10 );

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!