【问题标题】:Passing an array to pthread_create将数组传递给 pthread_create
【发布时间】:2016-11-19 23:56:45
【问题描述】:

所以我试图制作一个程序,在 c 中创建一个线程,其工作是找到 2 个给定数字的最大值。我编写的第一个程序(名为 askisi.c)如下:

#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 我得到了这些错误:

现在经过大量研究,我发现我的函数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; 指令实际作用的可以理解的解释。

【问题讨论】:

    标签: c pthreads


    【解决方案1】:

    void 不是真正的类型,在这种情况下,它意味着函数期望任何类型,由程序员决定使用casting 完成哪个。

    因此,通过执行char **arguments = (char**)param;,您将参数转换为char **,并将该转换分配给变量arguments

    【讨论】:

    • 好的,但是为什么在这个转换之后我引用了一个带有arguments[1]而不是*arguments[1]的元素?
    • arguments 是一个指向 char 数组的指针(为了更容易理解,我们可以说它是一个指向字符串数组的指针)。因此,如果您想访问第一个字符数组(或字符串),您可以使用*(arguments + pos)arguments[pos],因为它们是等效的。还有arguments它自己指向arguments[0]。我建议阅读array subscripts in C [users.ece.utexas.edu/~valvano/embed/chap8/chap8.htm] 以获得更好的想法
    猜你喜欢
    • 1970-01-01
    • 2016-01-07
    • 2023-03-31
    • 2020-09-26
    • 1970-01-01
    • 2023-03-15
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多