Linux C中的Pthread_join功能

问题描述 投票:0回答:2

程序:

#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
c linux multithreading ubuntu system-calls
2个回答
2
投票

加入是关于同步(在连接之后,连接的线程肯定完成)并获得线程的返回值(在每种情况下你返回的(void*)0s)。

它与IO重定向无关。线程共享相同的stdout / stdin(以及其他文件描述符和stdio缓冲区),并且写入(/读取)是立即的。在线程加入之前,它们不会被推迟。


0
投票

我可以从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);

我现在不专业,所以如果你愿意,你可以研究更好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.