2016-11-19 211 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