为什么锁定一个std ::互斥两次“未定义行为”?为什么锁定一个std ::互斥两次“未定义行为”?

2019-05-12 09:21发布

按本文章 :

如果你试图在同一个线程锁定一个非递归互斥两次之间没有解锁,你得到了一个未定义的行为。

我很幼稚的头脑告诉我,为什么他们不直接返回一个错误? 是否有一个原因,为什么这必须是UB?

Answer 1:

因为它从来就不是一个正确的程序,并作出检查的东西永远不会发生浪费(并做出检查它需要存储拥有线程ID,这也是浪费)。

请注意,这是不确定的允许调试实现抛出异常,例如,同时仍然允许发布实施,以尽可能高效。



Answer 2:

未定义行为允许实现尽一切最快/最方便的。 例如,有效的实现非递归互斥的情况下可能是锁定操作与在循环中的原子比较并交换指令来实现的单个位。 如果拥有互斥体的线程试图再次锁定它,它就会死锁,因为它正在等待互斥锁解锁,但由于没有人能解开它(除非有其中一些线程不拥有它揭示它的一些其他的bug)的线程将永远等待下去。



文章来源: Why is locking a std::mutex twice 'Undefined Behaviour'?