我写了这个程序:
pthread_cond_t placeFootCondition;
pthread_mutex_t rf,lf;
void* rss(void* in){
while(1){
pthread_mutex_lock(&rf);
printf ( "rss: waiting for condition\n" );
pthread_cond_wait(&placeFootCondition,&rf);
printf ( " Right Single Support \n" );
sleep(1);
pthread_mutex_unlock(&rf);
}
}
void* lss(void* in){
while(1){
pthread_mutex_lock(&lf);
printf ( "lss: waiting for condition\n" );
pthread_cond_wait(&placeFootCondition,&lf);
printf ( "Left Single Support \n" );
sleep(1);
pthread_mutex_unlock(&lf);
}
}
int main(){
int rc;
pthread_mutex_init(&rf,NULL);
pthread_mutex_init(&lf,NULL);
pthread_cond_init(&placeFootCondition,NULL);
pthread_create(&t1,NULL,rss,NULL);
pthread_create(&t2,NULL,lss,NULL);
sleep(1);
rc=pthread_cond_broadcast(&placeFootCondition);
if(rc!=0) printf ( "rc=%i\n",rc );
sleep(5);
}
但该程序的输出是
rss: waiting for condition
lss: waiting for condition
Right Single Support
rss: waiting for condition
pthread_cond_broadcast(& placeFootCondition)不应该唤醒所有线程???
答案 0 :(得分:3)
这是你在做什么:
pthread_cond_wait(&placeFootCondition,&rf); /* First thread uses rf mutex. */
pthread_cond_wait(&placeFootCondition,&lf); /* Second thread uses lf mutex. */
以下是the standard关于使用不同互斥锁的说法:
当一个线程等待一个条件变量时,指定了一个 特别是互斥到pthread_cond_timedwait()或者 pthread_cond_wait()操作,之间形成动态绑定 只要at处于有效状态的互斥和条件变量 条件变量上至少阻塞了一个线程。在这 时间,任何线程尝试等待该条件的效果 变量使用不同的互斥锁未定义。
从最后一行开始,在等待条件变量时,你应该使用相同的互斥锁。
答案 1 :(得分:0)
除了错误使用不同的互斥锁之外,您的程序不遵循逻辑。条件变量表示的条件是什么? (这被称为'谓词'。)如果没有谓词,你将会失去唤醒。
pthread_cond_wait
函数,尽管它的名字,但不是条件等待。这是条件的无条件等待 。只有在等待条件时才能调用它。
假设你和你的妹妹共用一辆车,当你的妹妹借用它时你不能使用这辆车,所以你等着你的妹妹回家。好吧,如果她已经回家了,你将会等待很长时间! (如果她回家,但当你上车时,她和汽车都不见了,你必须再等一等。)
模式是(适合你):
// let's get the car
pthread_mutex_lock(&mutex_that_protects_car);
while(car==SISTER_HAS_CAR) // car is gone
pthread_mutex_wait(&condition_variable, &mutex_that_protects_car);
car=BROTHER_HAS_CAR; // it's my car now
pthread_mutex_unlock(&mutex_that_protects_car);
// we now have the car
和你的妹妹:
// we are done with the car, make it free
pthread_mutex_lock(&mutex_that_protects_car);
car=CAR_IS_FREE;
pthread_cond_broadcast(&condition_variable); // he can have the car
pthread_mutex_unlock(&mutex_that_protects_car);
请注意,汽车的状况必须由单个共享互斥锁保护。汽车的状态是谓词,它由互斥锁保护并由线程共享。
另请注意,我们只会在等待条件时调用pthread_cond_wait
。当汽车空闲时,我们不会等待。我们一直在等待,以防她再拿起汽车,然后我们就抓住了它。