2012-06-23 19 views
14

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?

+0

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

+0

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

Respuesta

26

Porque nunca sucede en un programa correcto, y hacer una comprobación de algo que nunca sucede es un desperdicio (y para hacer ese control necesita almacenar el ID del hilo propietario, que también es un desperdicio).

Tenga en cuenta que no estar definido permite a las implementaciones de depuración arrojar una excepción, por ejemplo, al mismo tiempo que permite que las implementaciones de versiones sean lo más eficientes posible.

+1

buena A, pero creo que las buenas implementaciones de dbg deben afirmarse, ya que a veces ppl: P escribe código que come excepciones sin hacer mucho ruido. :RE – NoSenseEtAl

15

El comportamiento no definido permite que las implementaciones hagan lo que sea más rápido/más conveniente. Por ejemplo, una implementación eficiente de un mutex no recursivo podría ser un único bit donde la operación de bloqueo se implementa con una instrucción atómica de comparación e intercambio en un bucle. Si el hilo que posee el mutex intenta volver a bloquearlo, se bloqueará porque está esperando a que se abra el mutex pero dado que nadie más puede desbloquearlo (a menos que haya algún otro error donde algún hilo que no sea suyo lo desbloquea) hilo esperará por siempre.

Cuestiones relacionadas