ein Kapitel zurück                                           ein Kapitel weiter

Als erste Funktion dürfte wohl die Funktion zum Starten eines Threads von Interesse sein. Hier der Syntax zum Starten eines neuen Threads........

#include <pthread.h>

int pthread_create(pthread_t newthread, pthread_attr_t *attribute,
                   void *(*funktion)(void *), void *arg);  

Hiermit wird ein neuer Thread erzeugt mit der Thread-ID newthread, den Attributen attribute (bei Übergabe eines NULL-Zeigers wird die default-Einstellung genommen), der Funktion funktion die man genauso sehen kann wie die main()-Funktion bei Prozessen und außerdem noch dem Argumenten arg für die Funktion funktion. Auch hier kann man wenn nicht benötigt den NULL-Zeiger übergeben.

Bevor wir uns ein Programmbeispiel dazu ansehen benötigen wir noch eine Funktion um einen oder mehrere Threads wieder zu beenden. Hierzu die Funktion.........

#include <pthread.h>

void pthread_exit(void *retval);  

Beendet wird der Mainthread auch, falls irgendein beliebiger Thread exit() aufruft oder der Prozess das Signal SIGKILL erhält . Dabei werden alle anderen laufenden Threads ebenfalls beendet.

Zu dem nun folgenden Beispiel müssen sie die Library pthread hinzulinken mit....

gcc -o programm programm.c -lpthread  

Hier nun unser erstes Beispiel..........

/*Download:thread1.c*/
#include <stdio.h> #include <pthread.h> void hallo(void *name) { int i; for(i=0; i<500; i++) printf("%d : %s sagt Hallo!\n",i ,(char *)name); pthread_exit((void *) 0); } int main() { pthread_t t1, t2; if(pthread_create(&t1, NULL, (void *)&hallo, (void *)"Thread 1") != 0) { fprintf(stderr, "Fehler bei Thread 1......\n"); exit(0); } if(pthread_create(&t2, NULL, (void *)&hallo, (void *)"Thread 2") != 0) { fprintf(stderr, "Fehler bei Thread 1......\n"); exit(0); } return 0; }

Wir erzeugen hier 2 Threads und haben schon unser erstes Problem mit unserem Programm. Wenn "Thread1" bis 500 gezählt hat und sich mit pthread_exit beendet, wird automatisch auch unser "Thread2" beendet. Egal wie weit dieser bisher gezählt hat. Es fehlt uns also noch eine Funktion die auf die Beendigung der einzelnen Threads wartet, wie dies wait oder waitpid bei fork erledigt.

Hier also die Funktion die auf die Beendigung eines Threads wartet.....

int pthread_join(phtread_t th, void **retvalue);  

Mit dieser Funktion wird auf die Beendigung des Threads th gewartet. Ist der Wert von retvalue ungleich NULL, wird dieser Wert als Rückgabewert des beendeten Threads zurückgegeben. Hierzu nun unser Programm mit pthread_join.....

/*Download:thread2.c*/
#include <stdio.h> #include <pthread.h> void hallo(void *name) { int i; for(i=0; i<500; i++) printf("%d : %s sagt Hallo!\n",i ,(char *)name); pthread_exit((void *) 0); } int main() { pthread_t t1, t2; if(pthread_create(&t1, NULL, (void *)&hallo, (void *)"Thread 1") != 0) { fprintf(stderr, "Fehler bei Thread 1......\n"); exit(0); } if(pthread_create(&t2, NULL, (void *)&hallo, (void *)"Thread 2") != 0) { fprintf(stderr, "Fehler bei Thread 1......\n"); exit(0); } pthread_join(t1, NULL); pthread_join(t2, NULL); return 0; }

Nun wartet auch "Thread1" auf die Beendigung von "Thread2". Ein weiteres wichtiges Beispiel soll Threads von Prozessen auseinanderhalten. Wenn sie Beispielsweise die Funktion sleep verwenden würde zum Beispiel bei User-Level-Threads der ganze Prozeß und somit auch alle anderen Threads lahmgelegt. Daran können sie erkennen das jeder Thread in einem eigenen Prozeß gepackt wird.

Sie können ja gerne mal das nächste Programm testen und dabei eine weitere Konsole öffnen und sich darin mittels ps x übersicht zu den Prozessen zu verschaffen. Und tatsächlich bekommt jeder Thread eine eigenen PID. Dies sollte sie deshalb nicht verwirren, daß alle Threads in ein und dem selben Prozeß laufen. Hier also das Programmbeispiel mit sleep..........

/*Download:thread3.c*/
#include <stdio.h> #include <pthread.h> void sleep_t1(void *name) { int i; for(i=0; i<5; i++) { printf("%s schläft jetzt!\n",(char *)name); sleep(3); printf("%s ist jetzt wieder wach!\n",(char *)name); } pthread_exit((void *) 0); } void sleep_t2(void *name) { int i; for(i=0; i<5; i++) { printf("%s schläft jetzt!\n",(char *)name); sleep(1); printf("%s ist jetzt wieder wach!\n",(char *)name); } pthread_exit((void *) 0); } int main() { pthread_t t1, t2; if(pthread_create(&t1, NULL, (void *)&sleep_t1, (void *)"Thread 1") != 0) { fprintf(stderr, "Fehler bei Thread 1......\n"); exit(0); } if(pthread_create(&t2, NULL, (void *)&sleep_t2, (void *)"Thread 2") != 0) { fprintf(stderr, "Fehler bei Thread 1......\n"); exit(0); } pthread_join(t1, NULL); pthread_join(t2, NULL); return 0; }

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf