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
函数的指针参数不再有效。
使用 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
函数的指针参数不再有效。