程序:
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
void* pfun1(void *vargp);
void* pfun2(void *vargp);
void main(){
int treturn,jreturn;
pthread_t tid1,tid2;
printf("Before thread call\n");
treturn = pthread_create(&tid1,NULL,pfun1,NULL);
treturn = pthread_create(&tid2,NULL,pfun2,NULL);
jreturn = pthread_join(tid1,NULL);
//jreturn = pthread_join(tid2,NULL);
printf("After thread call\n");
}
void* pfun1(void *vargp){
int i;
for(i=0;i<5;i++){
printf("Thread1: %d\n",i);
sleep(1);
}
return (void*)0;
}
void* pfun2(void *vargp){
int i;
for(i=5;i<10;i++){
printf("Thread2: %d\n",i);
sleep(1);
}
return (void*)0;
}
在上面的程序中,我只使用pthread_join()加入了主程序的第一个线程。第二个线程只是创建而不是附加到main。但输出函数也包含第二个线程的输出。为什么即使它没有连接到main也能获得第二个线程的输出?
输出:
Before thread call
Thread2: 5
Thread1: 0
Thread2: 6
Thread1: 1
Thread2: 7
Thread1: 2
Thread2: 8
Thread1: 3
Thread2: 9
Thread1: 4
After thread call
加入是关于同步(在连接之后,连接的线程肯定完成)并获得线程的返回值(在每种情况下你返回的(void*)0
s)。
它与IO重定向无关。线程共享相同的stdout / stdin(以及其他文件描述符和stdio缓冲区),并且写入(/读取)是立即的。在线程加入之前,它们不会被推迟。
我可以从this link pthread_join
了解只是等待主要功能内的tid1 retrun,它不会阻止tid2输出。所以我想,如果你想在tid1之后运行tid2只需切换行:
treturn = pthread_create(&tid1,NULL,pfun1,NULL);
jreturn = pthread_join(tid1,NULL);
treturn = pthread_create(&tid2,NULL,pfun2,NULL);
我现在不专业,所以如果你愿意,你可以研究更好的解决方案。