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);
}
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