加入多个线程

时间:2016-10-06 15:28:58

标签: c multithreading pthreads

我的程序基本上应该做的是它需要多个命令行参数并为每个参数创建一个线程。每个线程都分配给一个primeFactors函数,该函数返回一个指向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循环,程序正常工作。当我连接多个线程并打印每个线程的返回值数组时,似乎会出现问题。当我使用两个命令行参数运行它时,我得到了一个巨大的数字列表,好像我运行了一个随机数生成器,而不是找到素数因子。我认为这个错误可能很小,所以我很感激您的任何建议!

2 个答案:

答案 0 :(得分:0)

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

您可以尝试让父母为每个线程分配空间'prime_array&amp;将其地址作为参数传递。

答案 1 :(得分:0)

由于您还没有发布完整的代码,因此无法查明导致您悲痛的确切问题,不过这里有 -

明显的错误 -

  1. pthread_join(tid[i], &prime_array);应为
       pthread_join(tid[j], &prime_array); /* Jay instead of Eye. */
  2. 建议 -

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

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