我是多线程编程的新手,对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()线程的情况。
感谢, 米尔
答案 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库。我认为它可能在关闭时忽略任何流锁。