Почему блокировка std:: mutex дважды 'Undefined Behavior'?
В соответствии с этим article:
Если вы попытаетесь заблокировать нерекурсивный мьютекс дважды из одного и того же потока без разблокировки между ними, вы получите поведение undefined.
Мой самый наивный ум говорит мне, почему они просто не возвращают ошибку? Есть ли причина, по которой это должно быть UB?
Ответы
Ответ 1
Потому что это никогда не происходит в правильной программе, и сделать чек для чего-то, что никогда не происходит, является расточительным (и для того, чтобы проверить, что ему нужно сохранить идентификатор используемого потока, который также расточительно).
Обратите внимание, что это undefined позволяет реализациям отладки вызывать исключение, например, при одновременном обеспечении максимально эффективной реализации релиза.
Ответ 2
Undefined поведение позволяет реализациям делать то, что является самым быстрым/наиболее удобным. Например, эффективная реализация нерекурсивного мьютекса может быть одним битом, где операция блокировки реализуется с помощью атомной команды сравнения и замены в цикле. Если поток, которому принадлежит мьютекс, пытается заблокировать его снова, он будет блокирован, потому что он ожидает разблокировки мьютекса, но поскольку никто другой не может его разблокировать (если нет какой-либо другой ошибки, в которой какой-то поток, который не владеет им, разблокирует) поток будет ждать всегда.