18

根据这篇文章

如果您尝试从同一线程锁定非递归互斥锁两次,而在两者之间没有解锁,您会得到未定义的行为。

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

4

2 回答 2

33

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

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

于 2012-06-23T22:41:06.673 回答
16

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

于 2012-06-23T22:53:30.403 回答