2015-09-28 211 views
1

关于下面的代码,我的理解是线程1抓住锁,检查条件,解锁时钟,将自己设置为睡眠状态。之后,线程2声明相同的锁定和增加计数,然后唤醒睡眠线程。我的问题是,现在的情况仍然是错误的,但它唤醒了睡眠线程,会发生什么?而条件变量也是一组线程,所以如果有很多线程同时执行代码,wait()如何处理这种情况呢?最后请解释一下这段代码的正确执行顺序,非常感谢!关于pthread_cond_wait的困惑

thread 1: 
    pthread_mutex_lock(&mutex); 
    while (!condition) 
     pthread_cond_wait(&cond, &mutex); 
    /* do something that requires holding the mutex and condition is true */ 
    pthread_mutex_unlock(&mutex); 

thread2: 
    while(1){ 
    pthread_mutex_lock(&mutex); 
    count++; 
    pthread_cond_signal(&cond); 
    pthread_mutex_unlock(&mutex); 
    } 
+0

你认为'while(!condition)'做什么?只要条件不成立,线程1将继续重新运行while循环的主体,即它将一直等待该条件。 – immibis

+0

@immibis第二次解锁是做什么的?只需解锁锁wait()返回? –

+0

第二次解锁? – immibis

回答

0

我的问题是,条件,现在仍然是假的,但它 唤醒沉睡的线程,会发生什么?

这就是为什么pthread_cond_waitwhile循环。它仅在while环路中出现,当pthread_cond_wait解锁时条件成立。

而这正是pthread_cond_wait man page笔记需要完成的。

当使用条件变量总是有一个布尔谓词 涉及与每个条件等待是 真,如果线程应进行相关的共享变量。可能会发生 pthread_cond_timedwait()或pthread_cond_wait()函数的虚假唤醒。 由于从pthread_cond_timedwait()或pthread_cond_wait() 返回并不意味着此谓词的值,因此在返回时应重新评估谓词。

(Emphasis mine)。

0

1)线索1锁 2)线索1解锁互斥量(与调用pthread_cond_wait互斥) 3)Thtead 2锁定互斥 4)线程2解锁互斥量并发送信号(pthraed_cond_signal)5)螺纹1gets互斥量回 6)线程1解锁互斥锁