pthreads和pthread_join函数的行为

时间:2010-09-29 17:15:03

标签: c++ pthreads

我是多线程编程的新手,对pthreads有疑问。

这是我运行的测试代码,我不理解它的行为。有人可以点亮它。

void *t1(void *args){  
    printf("returning from t1\n");  
    return;  
}  

void *t2(void *args){  
    printf("returning from t2\n");  
    return;  
}  

int main(){  
    pthread_t thread1,thread2;      
    int r1,r2;  
    r1=pthread_create(&thread1,NULL,t1,NULL);  
    r2=pthread_create(&thread2,NULL,t2,NULL);  

    pthread_join(thread1,NULL);    
 // pthread_join(thread2,NULL);   

    return 0;  
}  

此程序的行为是以下5个中的任何一个

murtuza@murtuza:FFTW$ ./ptest  
returning from t2  
returning from t1  
murtuza@murtuza:FFTW$ ./ptest  
returning from t1  
returning from t2  
murtuza@murtuza:FFTW$ ./ptest  
returning from t1  
murtuza@murtuza:FFTW$ ./ptest  
returning from t2  
returning from t2  
murtuza@murtuza:FFTW$ ./ptest  
returning from t1  
returning from t2  
returning from t2  

我不明白第4和第5输出。为什么线程t2执行两次?当然,如果我取消注释pthread_join(&thread2,NULL,t2,NULL) 该程序将正常运行,但我特别感兴趣的是只有一个线程加入main()线程的情况。

感谢, 米尔

3 个答案:

答案 0 :(得分:1)

我担心我无法复制你的问题。

我跑了:

#include <pthread.h>
#include <stdio.h>

void *t1(void *args){  
    printf("returning from t1\n");  
    return NULL;  
}  

void *t2(void *args){  
    printf("returning from t2\n");  
    return NULL;  
}  

int main(){  
    pthread_t thread1,thread2;      
    int r1,r2;  
    r1=pthread_create(&thread1,NULL,t1,NULL);  
    r2=pthread_create(&thread2,NULL,t2,NULL);  

    pthread_join(thread1,NULL);    
 // pthread_join(thread2,NULL);   

    return 0;  
}  

如:

while (true) ; do ./ptest ; date ; done

并发现:t1,t2; t2,t1和t1。

但从未重复输入,或丢失了t1。

对不起。

也许你的线程库中存在某些问题,或者是从线程化进程打印出来的?

答案 1 :(得分:1)

可能是线程t2没有执行两次,但是stdio库正在打印输出两次,因为当两个线程调用printf()而没有任何锁定时存在竞争条件。您可以尝试将对printf()的调用放在pthread_mutex_lock()/ pthread_mutex_unlock()对中(当然都锁定相同的互斥锁),看看是否会导致症状消失。

答案 2 :(得分:1)

我想你希望我们在这里解释未定义的行为。离开main()后,永远不应该使用任何C库函数。我认为你所看到的是main()线程刷新缓冲区正在关闭C库。我认为它可能在关闭时忽略任何流锁。