c++ - 为什么 libc++ 允许递归锁定 std::mutex?
问题描述
std::mutex
是非递归的,违反它的是UB。所以理论上一切皆有可能(包括作为std::recursive_mutex
)),但 libc++似乎工作正常,这个程序输出
再见
#include <iostream>
#include <mutex>
std::mutex m;
int main() {
std::scoped_lock l1(m);
std::scoped_lock l2(m);
std::cout << "bye" << std::endl;
}
这是 libc++ 中的有意设计决定还是只是一些意外(例如,他们可以对互斥锁和递归互斥锁使用相同的逻辑)?
libstdc++ 挂起。
注意:我知道人们不应该依赖 UB,所以这不是关于最佳实践,我只是对晦涩的实现细节感到好奇。
解决方案
这似乎不是一个有意的设计决定。libc++ 的实现std::mutex
只是平台的 POSIX 默认互斥体的包装。由于这也被定义为在递归锁定时具有 UB,因此它们只是继承了平台的默认 POSIX 互斥锁也恰好允许递归锁定的事实。
推荐阅读
- angular - Angular 4 *ngFor 循环将值解析为指令作为参数
- java - Spring的编译时和运行时注释之间的区别
- python - PackageNotInstalledError:包未安装在前缀中
- reactjs - 如何使用反应显示无法选择/复制的文本
- mongodb - 使用 MongoDB 休眠 OGM - 创建 EntityManagerFactory 时出现 ClassNotFoundException
- python - 如何在 Bar Plot、Plotly 中设置 bin 大小
- python - Django - 如何提交多个表单
- javascript - 从子类错误继承
- cassandra - 为什么我没有在 grafana 中获得所有 cassandra 指标?
- android - 使用 DataBinding 时,MediatorLiveData 永远不会变为活动状态