为什么锁定 std::mutex 两次是"未定义的行为"?

Why is locking a std::mutex twice 'Undefined Behaviour'?

本文关键字:未定义 两次 std 锁定 mutex 为什么      更新时间:2023-10-16

根据这篇文章:

如果您尝试从同一线程锁定非递归互斥锁两次,而中间没有解锁,则会出现未定义的行为。

我非常天真的头脑告诉我,为什么他们不返回错误?有没有理由必须这是UB?

因为它永远不会发生在正确的程序中,并且检查从未发生过的事情是浪费的(并且要进行检查,它需要存储拥有线程ID,这也是浪费)。

请注意,未定义允许调试实现抛出异常,例如,同时仍允许发布实现尽可能高效。

未定义的行为允许实现执行任何最快/最方便的操作。例如,非递归互斥锁的有效实现可能是单个位,其中锁定操作是使用循环中的原子比较和交换指令实现的。如果拥有互斥锁的线程尝试再次锁定它,它将死锁,因为它正在等待互斥锁解锁,但由于没有其他人可以解锁它(除非有其他一些错误,一些不拥有它的线程解锁它),线程将永远等待。