我会直截了当地说这是一个家庭作业。我非常接近,但有一件小事我想不通。该程序要求用户在一行中输入任意数量的数字。对于他们输入的每个数字,它将创建一个新线程,然后打印出找到该数字的Collatz猜想的过程。
除了我不能使用for循环创建多个线程这一事实外,我完成了所有工作。我创建了一个线程数组,然后尝试从输入中为每个数字创建一个新的线程,但它似乎只创建一个线程然后退出程序。
为什么它没有工作的任何想法?
P.S。 C绝对不是我的强项,这只是我写的第三个程序。因此,我仍在学习和挣扎于语言。
代码:
#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);
}
答案 0 :(得分:1)
for (j = 0; j < size; j++) {
pthread_create(&tid_array[j], &attr, updater(nums[j]), NULL);
pthread_join(&tid_array[j], NULL);
}
加入一个线程等待它完成,所以你一次只运行一个线程。相反,首先创建所有线程。然后当你想要等待它们全部完成时加入它们(或者如果你不这样做则将它们分开)。
答案 1 :(得分:1)
您不应该在pthread_exit(0)
中致电void *updater(int num)
,因为它会终止您的计划。您只需从此方法返回NULL
。
等到你在加入之前创建了所有线程。加入一个线程将等待它完成,所以一旦你创建它们就加入线程,你就没有任何好处。这应该是:
for (j = 0; j < size; j++) {
pthread_create(&tid_array[j], &attr, updater(nums[j]), NULL);
}
for (j = 0; j < size; j++) {
pthread_join(&tid_array[j], NULL);
}