【发布时间】:2012-11-16 07:20:43
【问题描述】:
我一直在仔细研究以下 SO 问题的公认答案:C++0x has no semaphores? How to synchronize threads?
在该答案的信号量实现中,这是wait() 函数的实现:
void wait()
{
boost::mutex::scoped_lock lock(mutex_);
while(!count_)
condition_.wait(lock);
--count_;
}
我试图了解while(!count_) 条件的目的。
另一个 SO 问题 (How does this implementation of semaphore work?) 的答案表明,当在条件变量上调用 notify_one() 时,可能会有 MORE THAN ONE 线程等待该条件变量醒来 - 因此需要while 循环。我想确认这一点 - 是完整和/或正确的答案,还是有其他原因需要 while 循环?
如果唤醒了多个线程,哪个线程拥有互斥锁?我想得越多,如果由于对notify_one() 的一次调用而可以唤醒多个线程,它似乎就越不明确。两个唤醒线程是否不可能看到count_ 值高于 0,并继续递减count_,导致count_ 值小于 0,并违背目的(和信号量的正确性)?
【问题讨论】: