循环遍历一系列线程

时间:2017-02-22 04:44:53

标签: c linux pthreads

我会直截了当地说这是一个家庭作业。我非常接近,但有一件小事我想不通。该程序要求用户在一行中输入任意数量的数字。对于他们输入的每个数字,它将创建一个新线程,然后打印出找到该数字的Collat​​z猜想的过程。

除了我不能使用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);
}

2 个答案:

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