C语言 为什么pthread_create不能100%工作?



我最近在学习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);
}

相关内容

  • 没有找到相关文章

最新更新