|
![ein Kapitel weiter](../weiter.gif)
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 weiter](../weiter.gif)
© 2001,2002 Jürgen Wolf
|