#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”从未打印过。
答案 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),否则会分离线程,例如main
与pthread_detach(3)。另请参阅this。
阅读一些好的Pthread tutorial。另请参阅pthreads(7)。
顺便说一下,繁忙的循环pthread_create
味道不好(而且不环保:你无用地浪费电力)。喜欢一些空闲循环,可能使用sleep(3),nanosleep(2),pause(2)等;或者一些event loop(大约poll(2)等等...)。当然,调用for(;;);
会等待线程终止。