为什么信号量的条件/互斥量实现在其"wait()"函数中需要"while"循环?

Dan*_*aum 5 c++ boost

我一直在仔细研究以下SO问题的接受答案:C++ 0x没有信号量?如何同步线程?

在该答案的信号量实现中,这里是wait()函数的实现:

void wait()
{
    boost::mutex::scoped_lock lock(mutex_);
    while(!count_)
        condition_.wait(lock);
    --count_;
}
Run Code Online (Sandbox Code Playgroud)

我试图了解while(!count_)病情的目的.

另一个SO问题的答案(信号量的这种实现如何工作?)表明当notify_one()条件变量被调用时,有可能超过一个等待该条件变量的线程将被唤醒 - 因此需要while环.我想确认一下 - 是完整的和/或正确的答案,还是有其他原因while需要循环?

如果多个线程被唤醒,哪个线程拥有互斥锁?我想的越多,如果多个线程因单次调用而唤醒,那么看起来就越不明确notify_one().BOTH唤醒线程是否不可能将count_值看作高于0,并继续递减count_,导致count_值小于0,并且失败信号量的目的(和正确性)?

mit*_*ull 3

正如您已经提到的,可能存在虚假唤醒,或者notify_one由于实现细节而可能唤醒多个线程。

唤醒多个线程并不意味着所有线程都可以同时进入受保护的部分,它只是意味着当 ThreadA 释放锁时,ThreadB(在上一个示例中与 ThreadA 一起被唤醒)也可以进入受保护的区域。进入受保护的部分。此时 ThreadA 已经完成了它的工作,因此 ThreadB 不会看到该count变量处于与 ThreadA 发现它时相同的状态。