2017-02-22 8 views
0

Ich werde gerade sein und sagen, dass dies eine Hausaufgabe ist. Ich bin sehr nah, aber es gibt eine kleine Sache, die ich nicht herausfinden kann. Das Programm fordert den Benutzer auf, eine beliebige Anzahl von Zahlen in einer Zeile einzugeben. Für jede Nummer, die sie eingeben, wird ein neuer Thread erstellt, um dann den Prozess der Suche nach der Collatz-Vermutung für diese Nummer auszudrucken.Schleife durch eine Reihe von Threads

Ich habe alles funktioniert, außer für die Tatsache, dass ich nicht mehrere Threads mit einer for-Schleife erstellen kann. Ich mache ein Array von Threads und versuche dann, für jede Zahl aus der Eingabe eine neue zu erstellen, aber es scheint nur einen Thread zu machen und dann das Programm zu verlassen.

Irgendwelche Ideen für, warum es nicht funktioniert?

P.S. C ist definitiv nicht mein starker Anzug, das ist nur wie das dritte Programm, das ich darin geschrieben habe. Also lerne und kämpfe ich immer noch mit der Sprache.

Code:

#include <stdio.h> 
#include <string.h> 
#include <sys/types.h> 

void *updater(int num); 

int main() { 
    pid_t pid; 
    char input[50]; 
    int nums[100], size = 0, j; 
    char *pch; 

    pid = fork(); 

    if (pid < 0) { 
     fprintf(stderr, "Fork failed"); 
    } else if (pid == 0) { 
     printf("Enter any number(s) or 'q' to quit: "); 
     fgets(input, sizeof(input), stdin); 

     while (strcmp(input, "q") != 1) { 
      pch = strtok(input, " "); 

      while (pch != NULL) { 
       nums[size] = atoi(pch); 
       size++; 
       pch = strtok(NULL, " "); 
      } 

      pthread_t tid_array[size]; 
      pthread_attr_t attr; 
      pthread_attr_init(&attr); 

      for (j = 0; j < size; j++) { 
       pthread_create(&tid_array[j], &attr, updater(nums[j]), NULL); 
       pthread_join(&tid_array[j], NULL); 
      } 

      size = 0; 

      printf("Enter any number(s) or 'q' to quit: "); 
      fgets(input, sizeof(input), stdin); 
     } 
    } else { 
     wait(NULL); 
    } 

    return 0; 
} 

void *updater(int num) { 
    printf("%d ", num); 

    while (num != 1) { 
     if (num <= 0) { 
      printf("You cannot enter a negative number or 0\n"); 
      return; 
     } else if (num % 2 == 0) { 
      num = num/2; 
     } else { 
      num = 3 * num + 1; 
     } 

     printf("%d ", num); 
    } 

    printf("\n"); 
    pthread_exit(0); 
} 

Antwort

1

Sie sollten nicht pthread_exit(0) in void *updater(int num) aufrufen, da dies Ihr Programm beendet. Sie müssen nur NULL von dieser Methode zurückgeben.

Warten Sie, bis Sie alle Ihre Threads erstellt haben, bevor Sie ihnen beitreten. Wenn Sie einem Thread beitreten, werden Sie auf den Abschluss des Threads warten. Wenn Sie also Threads beitreten, erhalten Sie keinerlei Vorteile. Das sollte so aussehen:

+0

Das funktioniert, aber jetzt, sobald es durchgeht und jede Zahl ausgibt, kommt es nicht zu dem Punkt, an dem der Benutzer mehr Zahlen eingeben oder beenden kann. Es druckt diese zweite Eingabeaufforderung aus und wird danach beendet. – MrWhiteNerdy

1
 for (j = 0; j < size; j++) { 
      pthread_create(&tid_array[j], &attr, updater(nums[j]), NULL); 
      pthread_join(&tid_array[j], NULL); 
     } 

Joining ein Thread wartet darauf, es zu vollenden, so dass Sie zu einem Zeitpunkt nur ein Thread ausgeführt wird. Erstellen Sie stattdessen alle Threads zuerst. Dann schließe dich allen an, wenn du warten willst, bis alle fertig sind (oder entferne sie, wenn du es nicht tust).

Verwandte Themen