Jes*_*ood 16 c++ mutex undefined-behavior c++11
根据这篇文章:
如果您尝试从同一个线程锁定非递归互斥锁两次而不解锁,则会得到未定义的行为.
我天真的头脑告诉我他们为什么不回复错误?这有必要成为UB的原因吗?
R. *_*des 31
因为它永远不会发生在正确的程序中,并且检查从未发生过的事情是浪费的(并且进行检查需要存储拥有的线程ID,这也是浪费).
请注意,它是未定义的,允许调试实现抛出异常,例如,同时仍然允许发布实现尽可能高效.
Geo*_*edy 15
未定义的行为允许实现执行最快/最方便的操作.例如,非递归互斥锁的有效实现可能是单个位,其中锁操作是在循环中使用原子比较和交换指令实现的.如果拥有互斥锁的线程试图再次锁定它,它将会死锁,因为它正在等待互斥锁解锁但是因为没有其他人可以解锁它(除非有一些其他错误,其中一些不拥有它的线程解锁它)线程将永远等待.