C - pthread_create - Clang GCC 区别

C - pthread_create - Clang GCC difference

使用 clang (3.6.1) 和 gcc (5.1.0) 将参数传递给 pthread_create 会为一个奇怪的情况带来不同的结果,如下所示:

pthread_t spawn_bserver_thread(uint16_t portno)
{   
    pthread_t tid;
    int32_t sockfd = create_bserver(portno);
    set_nonblocking(sockfd);

    exit_ncurses();
    printf("%d\n", sockfd);

    if(pthread_create(&tid, NULL, bserver_thread, &sockfd) != 0)
        error("pthread_create");

    return tid;
}

和bserver_thread:

static void * bserver_thread(void *arg)
{
    printf("%d\n", *(int32_t*)arg);
    exit(1);
    ...
}

对于 gcc,它打印相同的数字,但对于 clang 则不同。 (我的典型结果是 4 和 4 与 gcc 但 4 然后 32767 与 clang)。我是不是做错了什么?

这里是 CFLAGS,如果它可以改变任何东西的话:-Wall -Wextra -ggdb

这个问题很可能是你无法控制线程什么时候开始运行,所以spawn_bserver_thread函数可能会在线程函数开始之前退出,也就是说sockfd变量超出范围,bserver_thread 函数的指针参数不再有效。