为啥这段代码运行时没有任何输出(关于 pthread)?
Posted
技术标签:
【中文标题】为啥这段代码运行时没有任何输出(关于 pthread)?【英文标题】:Why this piece of code run without any output (about pthread)?为什么这段代码运行时没有任何输出(关于 pthread)? 【发布时间】:2017-10-27 09:50:14 【问题描述】:#include <pthread.h>
#include <cstdio>
void *printa(void *)
printf("a");
return NULL;
void *printb(void *)
printf("b");
return NULL;
int main()
pthread_t pa, pb;
pthread_create(&pa, NULL, printa, NULL);
pthread_create(&pb, NULL, printb, NULL);
for(;;);
我希望它以任意顺序打印“a”和“b”,但它可以运行和退出而不打印任何内容。为什么? 添加: 所以原因是主函数在线程运行之前退出。 所以我添加了一个 for(;;);在 main 的末尾,似乎从来没有打印过“a”和“b”。
【问题讨论】:
【参考方案1】:您的程序在线程完成处理之前退出,您需要等待每个线程完成pthread_join
【讨论】:
...或其他一些防止进程提前终止的机制。【参考方案2】:printf
(实际上是stdout)通常是行缓冲的。请参阅 printf(3) 和 setvbuf(3) 和 stdio(3)。所以"a"
和"b"
字符串保留在stdout
的内部缓冲区中,您不会观察到任何输出...
在printf
中添加\n
,或者在printa
和printb
中调用fflush(3)(可能是fflush(NULL);
....)。另见flockfile(3)。
在调用pthread_create
之后,您应该在main
中的pa
和pb
上调用pthread_join(3),否则会有分离的线程,例如与pthread_detach(3)。另见this。
阅读一些好的Pthread tutorial。另见pthreads(7)。
顺便说一句,繁忙的循环for(;;);
品味不佳(而且不环保:您在无用地浪费电力)。喜欢一些空闲循环,可能使用sleep(3)、nanosleep(2)、pause(2)等;或一些event loop(围绕poll(2),等等...)。当然,对pthread_join
的调用将等待线程终止。
【讨论】:
以上是关于为啥这段代码运行时没有任何输出(关于 pthread)?的主要内容,如果未能解决你的问题,请参考以下文章