5

我一直在仔细研究以下 SO 问题的公认答案:C++0x has no semaphores? 如何同步线程?

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

void wait()
{
    boost::mutex::scoped_lock lock(mutex_);
    while(!count_)
        condition_.wait(lock);
    --count_;
}

我试图了解这种while(!count_)情况的目的。

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

如果唤醒了多个线程,哪个线程拥有互斥锁?我想得越多,如果由于一次调用notify_one(). 两个被唤醒的线程是否不可能看到该count_值高于 0,并继续进行减量count_,导致count_值小于 0,并破坏信号量的目的(和正确性)?

4

1 回答 1

3

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

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

于 2012-11-16T07:45:50.447 回答