为啥这段代码运行时没有任何输出(关于 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,或者在printaprintb 中调用fflush(3)(可能是fflush(NULL); ....)。另见flockfile(3)。

在调用pthread_create 之后,您应该在main 中的papb 上调用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)?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个链表程序没有给出任何输出?

为啥我的球拍程序没有给我任何输出?

为啥在增加数组名称时没有“需要左值”错误[重复]

有人能告诉我为啥这段代码似乎可以工作,但不能……拜托?

为啥这段代码可以在 Linux 上运行,但不能在 Windows 上运行?

为啥这段代码会删除文本的最后一行?