为什么这段代码运行时没有任何输出(关于pthread)?

时间:2017-10-27 09:50:15

标签: c pthreads

#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(;;);在主要结束时,似乎“a”和“b”从未打印过。

2 个答案:

答案 0 :(得分:2)

您的程序在完成线程处理之前退出,您需要等待每个线程完成pthread_join

答案 1 :(得分:1)

printf(实际上 stdout )通常是行缓冲的。请参阅printf(3)setvbuf(3)以及stdio(3)。因此,"a""b"字符串会保留在stdout的内部缓冲区中,并且您不会观察到任何输出...

\n中添加printf,或在fflush(NULL);和{{1}中致电fflush(3)(可能为printa ....) }}。另请参阅flockfile(3)

在调用printb后,您应该在pa的{​​{1}}和pb上拨打pthread_join(3),否则会分离线程,例如mainpthread_detach(3)。另请参阅this

阅读一些好的Pthread tutorial。另请参阅pthreads(7)

顺便说一下,繁忙的循环pthread_create味道不好(而且不环保:你无用地浪费电力)。喜欢一些空闲循环,可能使用sleep(3)nanosleep(2)pause(2)等;或者一些event loop(大约poll(2)等等...)。当然,调用for(;;);会等待线程终止。