BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #100529同步于 2021/1/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

锁的虚假唤醒

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