返回信息流最近对于虚假唤醒一直有疑惑,初步认识是,一次notify会使多个等待线程唤醒。所以有把if换成while的方案。那是不是notify_one就可以是一种方案呢,不必换成while。另外看网上说的,signal,broadcast和notify_one,notify_all还有很大区别。有大佬可以细讲讲吗?
这是一条镜像帖。来源:北邮人论坛 / cpp / #100529同步于 2021/1/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
锁的虚假唤醒
yahcc
2021/1/26镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
是条件变量的虚假唤醒,不是锁的虚假唤醒。
虚假唤醒的描述很简单:条件变量的conditional_variable::wait(std::unique_lock<std::mutex>&)方法有可能在未被notify的时候也会被唤醒。就这么简单。也不用管为什么:API就是这样定义的。不必想太多,只要遵从API就可以了。
所以,你把wait(std::unique_lock<std::mutex>&)放在while里就对了。或者使用wait( std::unique_lock<std::mutex>& lock, Predicate pred ),它内部有循环。
这和notify_one/notify_all没有关系。
上述说的是C++的condition_variable类型。
signal, broadcast可能是别的编程语言或者别的库的接口,我也不知道。
你可以参考一下C++ Core Guidelines的CP.42,“Don’t wait without a condition”:https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#cp42-dont-wait-without-a-condition
好的,谢谢
【 在 plazum (plazum) 的大作中提到: 】
: 你可以参考一下C++ Core Guidelines的CP.42,“Don’t wait without a condition”:https://isocpp...
后面signal和broadcast是pthread库内的
【 在 nuanyangyang (暖羊羊) 的大作中提到: 】
: 是条件变量的虚假唤醒,不是锁的虚假唤醒。
: 虚假唤醒的描述很简单:条件变量的conditional_variable::wait(std::unique_lock<std::mutex>&)方法有可能在未被notify的时候也会被唤醒。就这么简单。也不用管为什么:API就是这样定义的。不必想太多,只要遵从API就可以了。
: ...................
这个东西就是著名的mesa semantics,是早年设计这玩意的大佬制定的标准。想系统理解一下推荐看看OSTEP这本书的concurrency部分,深入浅出,读完并发就算是理论入门了。
【 在 yahcc (yahcc) 的大作中提到: 】
: 最近对于虚假唤醒一直有疑惑,初步认识是,一次notify会使多个等待线程唤醒。所以有把if换成while的方案。那是不是notify_one就可以是一种方案呢,...
: --
好的
【 在 Bentham (Bentham) 的大作中提到: 】
: 这个东西就是著名的mesa semantics,是早年设计这玩意的大佬制定的标准。想系统理解一下推荐看看OSTEP这本书的concurrency部分,深入浅出,读完并发就算是理论入门了。