我一直在仔细研究以下 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,并破坏信号量的目的(和正确性)?