当互斥锁解锁时,它会notify_all或notify_one
When a mutex unlocks does it notify_all or notify_one?
据我了解,当我有一个受std::lock_guard
或std::unique_lock
保护的线程集合时,std::mutex
,并且通过显式解锁或锁超出范围来解锁互斥锁,然后通知等待线程。
此通知是notify_one
还是notify_all
?
我怀疑前者避免匆忙等待,但想确定一下。
您似乎在问的是,当线程T0
锁定互斥锁M
,并且线程T1..Tn
在尝试锁定M
时被阻止时,当T0
解锁M
时会发生什么? 显然只有一个线程可以成功锁定M
,因此系统没有理由"通知"(即调度)多个服务员。 但是,您的问题并非特定于任何一个平台,因此答案可能必须是"它取决于实现"。
这取决于实现。等待线程可以在互斥锁::lock() 调用上下文中的用户空间中主动等待一段时间才能解锁互斥锁,一旦解锁,几个主动等待的线程可以同时检测到它,但只有一个线程能够锁定它。否则,在活动期通过后,mutex.lock() 发出系统调用,操作系统将线程放入该互斥锁的等待列表中。当它被解锁时,只有一个线程被唤醒/通知以获得锁。
相关文章:
- 方法错误"not all control paths return a value"和方法不返回值
- 生成文件:6:目标'all'的配方在 Ubuntu-16.04 上失败
- 每次都会重建多个程序的制作文件,尽管配方"all"被标记为虚假
- 制造:对'all'错误无能为力
- condition_variable.notify是同步点吗
- 为什么Eigen不能解析内置符号?(all、last、seq等)
- 警告"C++ requires a type specifier for all declaration"地图
- gcc -O2 比 gcc -O2 -g 小,后跟 strip --strip-all
- 警告:"Not all control paths return a value" c++
- AVX2浮子比较并获得0.0或1.0,而不是all-0或全零件
- 链接时,"grab what you need" 和 "grab all" 之间是否有某些内容(-wl,--whole-archive)?
- 在C++中向枚举添加"all"选项的好设计是什么?
- 对于属性上的 NOTIFY 信号,如果我给它一个参数有什么区别?
- 级运算符 ( "C++ requires a type specifier for all declarations" )
- gradle see output for model.components.binaries.all
- "uses of target_link_libraries must be either all-keyword or all-plain"
- SFINAE 功能的"catch-all"?
- 柯尼希查找和"C++ requires a type specifier for all declarations"
- "All arguments to functions are passed by value" C 中的,C++ 中对引用传递的混淆
- Axpection_ptr在All Handler中的奇特在CentOS 7和Windows上都奇怪地工作