【问题标题】:Print multiple child's return value after joining multiple threads加入多个线程后打印多个孩子的返回值
【发布时间】:2016-10-06 15:28:57
【问题描述】:

我的程序本质上应该做的是它接受多个命令行参数并为每个参数创建一个线程。每个线程都分配给一个 primeFactors 函数,该函数返回一个指向素数因子值的指针。

 void *primeFactors(void *param)
 {
      int* p_a = malloc((1000) * sizeof p_a[0]); //arbitrary size, will scale better later
      int number = atoi(param);
      ..... prime factor part .......
      p_a[j] = 0; //sentinel value
      pthread_exit(p_a);
 }

我已经检查过了,事实上,这确实返回了一个指向所有正确素因数的指针。我的主要功能是这样的

 int main(int argc, char *argv[])
 {
      int count = 2; //arbitrary 2 just for the purpose of testing 2 arguments
      pthread_t = malloc(count * sizeof(pthread_t));
      pthread_attr_t attr;
      pthread_attr_init(&attr);
      int i;
      for (i = 0; i < count; i++)
      {
           pthread_create(&tid[i], &attr, primeFactors, argv[i+1]);
      }
      int j;
      void *prime_array;
      int *p;
      for (j = 0; j < count; j++)
      {
           pthread_join(tid[i], &prime_array);
           p = prime_array;
           int n = 0;
           while (p[n] != 0)
           {
                 printf("%d ", p[n]);
                 n++;
           }
           printf("\n");
      }
      return 0;
 }

我只用一个命令行参数检查了这个程序,并且没有围绕 pthread_join 代码的 for 循环,程序可以正常工作。当我加入多个线程并打印每个线程的返回值数组时,似乎出现了问题。当我像我一样使用两个命令行参数运行它时,我得到了一个巨大的数字列表,就好像我运行了一个随机数生成器而不是找到素因子一样。我认为错误可能很小,因此我很感激您提出的任何建议!

【问题讨论】:

    标签: c multithreading pthreads


    【解决方案1】:

    由于您尚未发布完整的代码,因此无法确定导致您悲伤的确切问题,但是这里是 -

    明显错误-

    1. pthread_join(tid[i], &amp;prime_array); 应该是
      pthread_join(tid[j], &amp;prime_array); /* Jay instead of Eye. */

    建议 -

    1. 而不是for (i = 0; i &lt; count; i++)
      使用for (i = 0; i &lt; (argc - 1); i++) /* Use 'argc' instead of the arbitrary 'count' */
      或者,设置int count = argc - 1

    2. 检查所用函数的返回值(malloc、pthread_xxx())。
      如果你这样做了,你可能会注意到 pthread_join() 返回了一个错误值。

    【讨论】:

    • 遗憾的是,您指出的明显错误正是我遇到错误的原因。纯粹是我的疏忽。你后来的建议也很棒。非常感谢你把我从一个愚蠢的错误中拯救出来!
    【解决方案2】:

    每个线程似乎都在分配自己的 prime_array;我没有看到它试图将其地址传回给父级。

    您可以尝试让父线程为每个线程的 prime_array 分配空间并将其地址作为参数传递。

    【讨论】:

      猜你喜欢
      • 2017-10-09
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 2023-04-05
      • 2021-07-15
      相关资源
      最近更新 更多