我最近在学习C中的线程,我注意到一些我认为奇怪的事情。让我们看下一个代码:
#include <stdio.h>
#include <pthread.h>
void *sub_routine(void *p)
{
p = NULL;
printf("This is a sub_routinen");
return (NULL);
}
int main(int argc, char **argv)
{
void *p;
pthread_t thread;
if (argc < 1)
return (0);
p = argv[1];
pthread_create(&thread, NULL, sub_routine, NULL);
sub_routine(p);
return (0);
}
我用这个命令行来编译我的程序:
gcc -Wall -Wextra -Werror -pthread pthreads.c
预期的结果是将This is a sub_routine
打印两次。这种情况时有发生,但不是100%。有什么特别的原因吗?
当main
返回时,即使其他线程正在运行,它也退出程序。因此,您生成的线程可能在主线程返回之前没有到达printf
,在这种情况下,程序在您看到两个消息之前结束。
main
的末尾添加对pthread_join
的调用,以告诉程序等待您创建的线程在main返回之前完成运行。这将确保您总是看到两个打印输出。
在主线程的末尾(就在返回之前)添加pthread_join(thread, NULL)以加入线程"sub_routine">
修改后的代码可以正常工作:
#include <stdio.h>
#include <pthread.h>
void *sub_routine(void *p)
{
p = NULL;
printf("This is a sub_routinen");
return (NULL);
}
int main(int argc, char **argv)
{
void *p;
pthread_t thread;
if (argc < 1)
return (0);
p = argv[1];
pthread_create(&thread, NULL, sub_routine, NULL);
sub_routine(p);
pthread_join(thread, NULL);
return (0);
}