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.1 Gr<strong>und</strong>lagen 113<br />

Abläufe, deren Endergebnis, wie in den beiden vorangehenden Fehlersituationen<br />

beschrieben, von der zeitlichen Abfolge der ausgeführten Operationen<br />

abhängig ist, nennt man zeitkritische Abläufe bzw. Race Conditions. Bereits<br />

ein so einfaches Beispielprogramm <strong>und</strong> die bei der Diskussion gewonnenen<br />

Einsichten nach dem Motto hätte, wenn <strong>und</strong> aber“ verdeutlichen schon, daß<br />

”<br />

die Fehlersuche in Pthreads-Programmen oftmals ein sehr schwieriges Unterfangen<br />

ist <strong>und</strong> daß deshalb schon vor <strong>und</strong> während der Implementierung<br />

äußerst gewissenhaft gearbeitet werden muß.<br />

Aber in Zeile 30 versteckt sich sogar noch ein weiteres Problem: Die per Referenz<br />

übergebene Zählvariable i ist nämlich eine lokale Variable der main()-<br />

Funktion. Sollte die Funktion sich also bereits beendet haben, bevor einer<br />

der gestarteten <strong>Threads</strong> die Variable adressiert, so greift dieser Thread auf<br />

einen ungültigen Speicherbereich zu <strong>und</strong> das Ergebnis ist unspezifiziert. Es ist<br />

also peinlich genau darauf zu achten, daß die übergebenen Referenzen solange<br />

gültig sind, wie andere <strong>Threads</strong> diese Bereiche adressieren. Im aktuellen<br />

Beispiel ist das geschilderte Fehlverhalten allerdings nicht möglich, da ein vorzeitiges<br />

Ende des main()-<strong>Threads</strong> mangels vorausgehendem pthread_join()<br />

gleichzeitig ein Ende aller gestarteten Pthreads nach sich zieht.<br />

Beispiel 3.3 behebt die angesprochenen Probleme <strong>und</strong> illustriert dabei gleichzeitig<br />

eine Methode, einfache int-Parameter als Zeiger getarnt in den Aufruf<br />

einer Pthreads-Startfunktion zu schmuggeln.<br />

1 #include <br />

2 #include <br />

3 #include <br />

4 #include <br />

5<br />

6 #define NUM_THREADS 3<br />

Beispiel 3.3. pthreads-exit2.c<br />

7<br />

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

9 {<br />

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

11<br />

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

13 sleep( 10 );<br />

14 printf( "Thread Nr. %d ist fertig.\n", num );<br />

15<br />

16 pthread_exit( (void *)num ); /* Threadnummer zurück */<br />

17 }<br />

18<br />

19 int main( int argc, char *argv[] )<br />

20 {<br />

21 pthread_t tid;<br />

22 int i, status;

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!