pthread_cond_broadcast不起作用?

时间:2011-09-02 09:53:50

标签: c pthreads

我写了这个程序:

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)不应该唤醒所有线程???

2 个答案:

答案 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。当汽车空闲时,我们不会等待。我们一直在等待,以防她再拿起汽车,然后我们就抓住了它。