【问题标题】:Why does a condition/mutex implementation of a semaphore require a "while" loop in its "wait()" function?为什么信号量的条件/互斥实现在其“wait()”函数中需要一个“while”循环?
【发布时间】: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,并违背目的(和信号量的正确性)?

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 2018-02-15
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多