加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:02:20 所属栏目:百科 来源:网络整理
导读:我一直在仔细研究以下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_
我一直在仔细研究以下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找到它相同的状态.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读