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

前端之家收集整理的这篇文章主要介绍了c – 为什么信号量的条件/互斥量实现在其“wait()”函数中需要“while”循环?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在仔细研究以下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()时,可能会唤醒等于该条件变量的多于一个线程 – 因此需要while循环.我想确认一下 – 是完整的和/或正确的答案,还是有其他原因需要while循环?

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

解决方法

可能有 spurious wakeups,或者notify_one可能会因为实现细节而唤醒多个线程,正如您已经提到的那样.

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

猜你在找的C&C++相关文章