因为在正确的程序中这种情况永远不会发生,而对从未发生的事情进行检查是浪费的(并且进行此检查需要存储拥有线程ID,这也是浪费的)。请注意,它没有被定义允许调试实现抛出异常,例如,同时仍允许发布实现尽可能高效。
未定义行为允许实现以最快/最方便的方式进行操作。例如,非递归互斥锁的高效实现可能是一个单一位,在其中锁定操作是通过循环中的原子比较和交换指令来实现的。如果拥有互斥锁的线程尝试再次锁定它,则会发生死锁,因为它正在等待互斥锁解锁,但由于除了某些线程错误地解锁外,没有其他人可以解锁它,所以该线程将永远等待。
mutex
可能是使用操作系统本地的mutex
实现的,因此不定义在不同操作系统上可能会有什么不同,这样std::mutex
就可以成为操作系统提供的mutex
的薄包装器。 - Phil1970