【问题标题】:Loop through an array of threads循环遍历线程数组
【发布时间】:2017-02-22 04:44:52
【问题描述】:

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

除了我无法使用 for 循环创建多个线程之外,我一切正常。我创建了一个线程数组,然后尝试为输入中的每个数字创建一个新线程,但似乎只创建一个线程然后退出程序。

关于它为什么不起作用的任何想法?

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

【问题讨论】:

    标签: c linux pthreads


    【解决方案1】:

    您不应该在void *updater(int num) 中调用pthread_exit(0),因为它会终止您的程序。您只需从此方法返回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);
    }
    

    【讨论】:

    • 这行得通,但现在一旦它通过并打印出每个数字,它就不会到达用户可以选择输入更多数字或退出的地步。它打印出第二个提示,但之后退出。
    【解决方案2】:
            for (j = 0; j < size; j++) {
                pthread_create(&tid_array[j], &attr, updater(nums[j]), NULL);
                pthread_join(&tid_array[j], NULL);
            }
    

    加入一个线程会等待它完成,因此您一次只能运行一个线程。相反,首先创建所有线程。然后在您想等待它们全部完成时加入它们(如果不这样做,则将它们分离)。

    【讨论】:

      猜你喜欢
      • 2014-06-04
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 2013-02-01
      • 2018-04-01
      • 2013-12-16
      相关资源
      最近更新 更多