2016-11-19 90 views
0

所以我試圖做一個程序,在c中創建一個線程,其工作是找到2個給定數字的最大值。我寫(名爲askisi.c)的第一個節目是如下:傳遞數組到pthread_create

#include <pthread.h> 
#include <stdio.h> 
#include <sys/types.h> 

int max; 

void *max_of_two(void *param); 

int main(int argc , char *argv[]) 
{ 
    pthread_t tid; 

    pthread_attr_t attr; 

    if (argc != 3) 
    { 
      fprintf(stderr,"You have to give 2 numbers... \n"); 
      return -1; 
    } 

    pthread_attr_init(&attr); 

    pthread_create(&tid,&attr,max_of_two,argv); 
    pthread_join(tid,NULL); 
    printf("max = %d\n",max); 
} 

void *max_of_two(void *param) 
{ 
    if(atoi(*param[1]) >= atoi(*param[2])) 
      max = atoi(*param[1]); 
    else 
      max = atoi(*param[2]); 
    pthread_exit(0); 
} 

但在Linux下使用gcc我得到這些錯誤: enter image description here

現在很多的研究後,我發現我的功能max_of_two應該這樣寫:

void *max_of_two(void *param) 
{ 
    char **arguments = (char**)param; 

    if(atoi(arguments[1]) >= atoi(arguments[2])){ 
      max = atoi(arguments[1]);} 
    else 
      max = atoi(arguments[2]); 
    pthread_exit(0); 
} 

的第一個問題是,我沒有找到爲什麼我的第一個程序沒有工作任何解釋。第二個是我沒有找到一個可以理解的解釋,說明char **arguments = (char**)param;的實際操作。

回答

0

void不是一個真正的類型,在這種情況下,它意味着函數期望任何類型,並由程序員決定使用casting完成哪個類型。

所以在做char **arguments = (char**)param;你鑄造參數char **並分配到變量arguments

+0

好的,但爲什麼在這個鑄造後im引用具有'arguments [1]'而不是'* arguments [1]'的元素? – asdf

+0

'arguments'是一個char數組的指針(爲了更容易理解,我們可以說它是一個指向字符串數組的指針)。所以,如果你想訪問第一個char(或字符串)數組,你可以使用'*(arguments + pos)'或'arguments [pos]',因爲它們是等價的。另外'arguments'它自己指向'arguments [0]'。 我建議閱讀關於'C中的數組下標'[http://users.ece.utexas.edu/~valvano/embed/chap8/chap8.htm]以獲得更好的想法 –

+0

會做。謝謝 – asdf