2016-10-06 62 views
0

什麼我的程序基本上是應該做的是,它需要多個命令行參數,併爲他們每個人的線索。每個線程都分配給一個primeFactors函數,該函數返回一個指向primefactor值的指針。打印多個孩子的返回值

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函數代碼迴路和程序工作。當我加入多個線程並打印每個線程的返回值數組時,問題似乎就會出現。當我通過它帶有兩個命令行參數運行像我一直在我得到一個巨大的數字的名單,如果我跑了一個隨機數發生器,而不是尋找素因子。我認爲這個錯誤可能很小,所以我會很感激你的任何建議!

+0

我看不出有什麼明顯的錯誤在你的代碼。我懷疑它在'primeFactors()'中。例如,'p_a [j] = 0中的'j';'不會超出緩衝區?你可以發佈[mcve]嗎? – usr

回答

0

既然你還沒有發佈完整的代碼是不可能查明導致你節哀確切的問題(一個或多個),但這裏有雲 -

明顯的錯誤 -

  1. pthread_join(tid[i], &prime_array);應該
    pthread_join(tid[j], &prime_array); /* Jay instead of Eye. */

建議 -

  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()返回了一個錯誤值。

+0

不幸的是,你指出的明顯錯誤正是我得到錯誤的原因。純粹忽略我的一部分。你後來的建議也很棒。非常感謝你讓我從一個愚蠢的錯誤中解脫出來! – lehast22

0

每個線程似乎是分配自己的prime_array;我沒有看到它試圖將其地址傳回給父母。

您可能會嘗試讓父級爲每個線程的prime_array分配空間&將其地址作爲參數傳遞。