为什么锁定 std::mutex 两次是"未定义的行为"?
Why is locking a std::mutex twice 'Undefined Behaviour'?
根据这篇文章:
如果您尝试从同一线程锁定非递归互斥锁两次,而中间没有解锁,则会出现未定义的行为。
我非常天真的头脑告诉我,为什么他们不返回错误?有没有理由必须这是UB?
因为它永远不会发生在正确的程序中,并且检查从未发生过的事情是浪费的(并且要进行检查,它需要存储拥有线程ID,这也是浪费)。
请注意,未定义允许调试实现抛出异常,例如,同时仍允许发布实现尽可能高效。
未定义的行为允许实现执行任何最快/最方便的操作。例如,非递归互斥锁的有效实现可能是单个位,其中锁定操作是使用循环中的原子比较和交换指令实现的。如果拥有互斥锁的线程尝试再次锁定它,它将死锁,因为它正在等待互斥锁解锁,但由于没有其他人可以解锁它(除非有其他一些错误,一些不拥有它的线程解锁它),线程将永远等待。
相关文章:
- 编译C++时未定义的引用
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++两次定义相同的函数会导致错误
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- "... already defined in *.obj"但我没有在同一范围内两次定义任何变量
- 根据下面的作者,如果两个指针指向不同的数组,则比较的第一个版本将未定义
- 如何在程序中声明/定义一次并在两个类中使用映射列表
- 为什么锁定 std::mutex 两次是"未定义的行为"?
- 多次定义"调度程序::_singleton",导入标头两次
- 使用重叠的关键帧合并两个未定义的贴图
- 为什么我不能一次定义两个指针
- 错误LNK2005:已经定义了包含头文件两次
- 如果关闭未执行两次,则无法确定大小
- 自定义分配器- Microsoft std::map实现对相同的元素进行两次重新分配,GCC工作得很好
- 在链接两个对象文件时,使用#ifndef防止定义一个函数两次
- 对初始化列表中使用了两次的变量进行递增——未定义的行为
- 使用初始化列表时未调用两次基构造函数
- 两个本地结构,每个都在单独的cpp文件中-未定义的行为
- 自定义库在应用程序中,我必须包括库依赖头两次