我写了以下代码:
#include <pthread.h>
#include <stdio.h>
void* sayHello (void *x){
printf ("Hello, this is %d\n", (int)pthread_self());
return NULL;
}
int main (){
pthread_t thread;
pthread_create (&thread, NULL, &sayHello, NULL);
printf("HERE\n");
return 0;
}
编译和运行后,我看到了3种不同类型的输出。
当然我可以使用第二个选项,但我不明白为什么如果我只创建一个线程,'sayHello'massege可以打印0或2次?
答案 0 :(得分:6)
你不能说当线程开始运行时,它可能直到开始
在之后从main
返回,这意味着该过程将结束,并且该过程将结束。
在离开pthread_join
之前,您必须等待线程完成main
。
第三种情况,来自线程打印两次的消息,可能是因为线程执行,并且缓冲区被写入stdout
作为行尾刷新的一部分,但是线程是在刷新完成之前抢占,然后该进程存在,这意味着刷新所有文件流(如stdout
),以便再次打印文本。
答案 1 :(得分:4)
你的main
函数只创建一个pthread,让它运行而不等待它完成。
当您的主函数返回时,操作系统将收回分配给pprocess的所有资源。但是新创建的pthread可能还没有运行。
这就是为什么你只有HERE
。
在main
函数返回之前完成新创建的线程。因此,您可以看到主线程和创建的线程的输出。
这应该是glibc
中的bug。有关详细信息,请参阅Unexpected output in a multithreaded program。
pthread_create
之后需要