Pthread: Beenden eines anderen Threads
-
Hallo,
ich möchte eine Programm schreiben, was aus zwei zufällig generierten Zahlen eine Additionsaufgabe macht, die innerhalb von 4 Sekunden gelöst werden soll. Wenn entweder der Timer abgelaufen ist, oder ein Ergebnis eingegeben wurde (egal ob richtig oder falsch), soll gefragt werden, ob noch ein Versuch erfolgen soll. Allerdings schaffe ich es nicht, den Zähler Thread zu beenden, wenn ein Ergebnis eingegeben wurde. Hier mal der code:
#include <pthread.h> #include <stdlib.h> #include <unistd.h> #include <time.h> void *funcZaehler() { pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); sleep(4); printf("Zu langsam\n"); pthread_exit(NULL); } void *funcEingabe(void* zaehler) { int eingabe,zahl1,zahl2, ergebnis; zahl1 = rand() % 100 + 1; zahl2 = rand() % 100 + 1; ergebnis = zahl1+zahl2; printf ("%d + %d\n", zahl1,zahl2); printf("Eingabe:%d", ergebnis); scanf("%i", &eingabe); if(eingabe==ergebnis) printf("Richtig\n"); else printf("Falsch\n"); pthread_cancel((pthread_t)zaehler); pthread_exit(NULL); /*_exit(0);*/ } int main() { pthread_t eingabe, zaehler; int ret1, ret2; time_t t; /* Zufallsvariablen initialisieren */ time(&t); srand((unsigned int)t); ret1 = pthread_create(&zaehler, NULL, funcZaehler, NULL); ret2 = pthread_create(&eingabe, NULL, funcEingabe, (void*) &zaehler); /*ret2 = pthread_create(&eingabe, NULL, funcEingabe, NULL);*/ pthread_join(zaehler, NULL); pthread_cancel(zaehler); pthread_join(eingabe, NULL); return 0; }
Anders gefragt: Wie kann ich aus einem Thread heraus einen anderen beenden?
-
Was sagt denn der Rueckgabewert von pthread_cancel? Wahrscheinlich "No thread with the ID thread could be found". Und warum: naja, du wartest mit pthread_join darauf, dass der Thread sich beendet. Auch den Aufruf von pthread_exit ist voellig ueberfluessig.
Ach ja, noch viel ueberfluessiges
void *funcEingabe(void* zaehler) { ... pthread_exit(NULL); }
Wird die Funktion verlassen, dann wird auch der Thread beendet. Desweiteren laesst sleep den aktuellen Prozess schlafen, also nicht nur den Thread.
-
Hi,
mag sein, aber das hilft mir ja nun nicht weiter. Aber danke trotzdem.
-
mag sein, aber das hilft mir ja nun nicht weiter.
Zeig mal etwas Initiative!
Was sagt denn nun der Rueckgabewert in void *funcEingabe(void* zaehler) von pthread_cancel? Auch solltest du dir die Signatur von pthread_cancel mal genau aunsehen. Du uebergibst einen Zeiger (gecastet auf pthread_t, was dumm ist). Was du wahrscheinlich brauchst ist sowas *((pthread_t)zaehler)*.