Según este article:¿Por qué está bloqueando un std :: mutex dos veces 'Comportamiento no definido'?
Si intenta bloquear un mutex no recursivo dos veces del mismo hilo sin desbloquear en el medio, se obtiene un comportamiento indefinido.
Mi mente muy ingenua me dice por qué no me acaban de devolver un error? ¿Hay alguna razón por la cual esto tiene que ser UB?
Es posible que desee utilizar atomic_flag con el orden de memoria predeterminado. No tiene carreras de datos y nunca arroja excepciones como mutex hace con múltiples llamadas de desbloqueo (y cancela incontrolablemente, podría agregar ...). Alternativamente, existe atómica (por ejemplo, atómica [bool] o atómica [int] (con corchetes triangulares, no [])), que tiene funciones agradables como load y compare_exchange_strong. http://www.cplusplus.com/reference/atomic/atomic_flag/ http://www.cplusplus.com/reference/atomic/atomic/ – Andrew
También como el 'mutex' podría implementarse con el mutex nativo del sistema operativo, entonces tiene sentido no definir qué podría ser diferente en el sistema operativo diferente para que 'std :: mutex' podría ser una envoltura delgada alrededor del sistema operativo proporcionado mutex. – Phil1970