关于pthread中的malloc行为

时间:2017-04-28 14:12:15

标签: c pthreads malloc

我的课程分为两部分:

  1. 库文件(libprog.c),只有一个函数:

    int *
    libfunc(void)
    {
        int     *i;
    
        i = malloc (sizeof(int));
    
        printf("in lib, %d\n", *i);
        return i;
    }
    
  2. 主程序(prog.c):

    void *
    thr_func(void *arg)
    {
        int     *p;
    
        p = libfunc();
        printf("in thr: %d\n", *p);
    
        return (void *)0;
    }
    
    int
    main(int argc, char **argv)
    {
        pthread_t       tid;
    
        pthread_create(&tid, NULL, thr_func, NULL);
        pthread_join(tid, NULL);
    
        return 0;
    }
    
  3. 正如您所看到的,我只是创建一个pthread并将thr_func()函数传递给它,然后调用libfunc(),它使用malloc()分配一个整数并返回其指针。 当我运行这个程序时,它会在i中输出整数libfunc(),但是当我尝试在thr_func()中访问它时会出现分段错误,它会给出段错误:

    bash-4.1$ ./prog
    in lib, 0
    Segmentation fault (core dumped)
    

    但是当我使用pthread删除线程创建并直接在thr_func()中调用main()时,程序运行成功:

    bash-4.1$ ./prog
    in lib, 0
    in thr: 0
    

    那么pthread如何影响这里访问内存的方式? 我该怎么做才能让它发挥作用?

1 个答案:

答案 0 :(得分:1)

问题是你的prog.c编译单元没有看到libfunc函数的声明。因此,使用以下(默认)声明:

int libfunc();

请注意,这与真实的不同:

int* libfunc();

现在,当从libfunc调用thr_func时,返回的int*指针将被解释为int,然后在转换为int*时将其存储在本地p变量中。将int强制转换为指针类型的结果是实现定义的。在您的平台上,这会导致混乱的指针值,最终导致分段错误。

要解决此问题,请将以下行添加到prog.c的顶部:

int* libfunc();

或者更好的是,创建一个与libprog.c一起使用的正确头文件。