【问题标题】:behaviour of pthreads and pthread_join functionpthreads 和 pthread_join 函数的行为
【发布时间】:2010-09-29 17:15:02
【问题描述】:

我是多线程编程的新手,有一个关于 pthread 的问题。

这是我运行的测试代码,我不明白它的行为。有人可以解释一下吗?

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() 线程的情况特别感兴趣。

谢谢, 米尔

【问题讨论】:

  • 我们是否遗漏了一些代码?你有 "free(a)" 并且 a 似乎没有被声明。
  • 哎呀!对不起!那是一个错字。我修好了它。问题还是一样。

标签: c++ pthreads


【解决方案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。

对不起。

也许您的线程库中有问题,或者从线程进程中打印出来的东西?

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我这样做了,但它仍然发生,所以我猜原因是别的。
    【解决方案3】:

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

    【讨论】:

    • 我认为您的解释可能是正确的,因为 thread2 的 pthread_join() 甚至 main() 中的 sleep() 都可以解决问题。
    猜你喜欢
    • 2020-08-04
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    相关资源
    最近更新 更多