为什么信号灯的条件/互斥体实现需要"wait()"函数中的"while"循环?
Why does a condition/mutex implementation of a semaphore require a "while" loop in its "wait()" function?
我一直在仔细研究以下SO问题的公认答案:C++0x没有信号量?如何同步线程?
在这个答案中的信号量实现中,这里是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,从而破坏信号量的目的(和正确性)吗?
可能存在虚假的唤醒,或者notify_one
可能由于实现细节而唤醒多个线程,正如您已经提到的那样。
唤醒多个线程并不意味着所有线程都可以同时进入受保护的部分,它只是意味着当ThreadA释放锁时,ThreadB(在上一个示例中与ThreadA一起被唤醒)也可以进入受保护部分。此时ThreadA已经完成了它的工作,所以ThreadB不会看到处于与ThreadA发现的相同状态的count
变量
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 如何在Wait()C++期间同时调用另一个函数
- 条件变量的"wait"函数在提供谓词时导致意外行为
- 为什么信号灯的条件/互斥体实现需要"wait()"函数中的"while"循环?
- 如何在C++中编写一个好的 Wait() 函数
- 对boost::condition_variable::wait的调用没有匹配的函数
- QThread.wait()函数有什么用
- wait() 函数有什么作用
- Wait函数和CloseHandle依赖