2009-09-29 14 views
7

La documentación de Microsoft no dice nada sobre lo que sucede si, por error, llamo al ReleaseMutex() cuando el mutex ya está desbloqueado.¿Qué sucede si lanzo ReleaseMutex() dos veces?

Detalles:

estoy tratando de arreglar un poco de código de Windows sin tener acceso al compilador.

Me doy cuenta de que los mutexes de WinApi son recursivos y cuentan con referencias. Si estuviera haciendo uso de esa característica, es obvio que la llamada extra ReleaseMutex() disminuiría prematuramente el contador de referencia.

Sin embargo, el código que estoy viendo no utiliza el mutex recursivamente, por lo que el recuento de referencias nunca supera el '1'. Es hace liberar el mutex más veces de las necesarias ... entonces, ¿qué ocurre? ¿El recuento de referencias es negativo? ¿Permanece en cero (desbloqueado) y simplemente devuelve un error ignorable?

(Naturalmente, este código no tiene realmente comprobar si hay errores cuando se llama a estas funciones!)

+0

Esta es una muy mala pregunta. Incluso si supiera, 'verifica bajo WinXP' podría ser completamente diferente en Win7. Entonces realmente nunca deberías hacer esto. (NB: Creo que está marcado) – Christopher

+5

La documentación no es silenciosa: http://msdn.microsoft.com/en-us/library/ms685066%28VS.85%29.aspx – peejaybee

+0

peejaybee, debe actualizar eso comentar a una respuesta! –

Respuesta

8

peejay proporciona un buen enlace en su comentario a la ReleaseMutex documentation. Creo que esta línea de la documentación responde a su pregunta:

función

El ReleaseMutex falla si el subproceso de llamada no posee el objeto de exclusión mutua .

Aunque no se dice explícitamente, creo que liberar un mutex (la primera vez) hace que la cadena de llamada ya no sea propietaria del objeto mutex. Por lo tanto, la segunda llamada simplemente fallará. Tal implementación también tendría sentido ya que permitiría detectar fácilmente este tipo de error (solo verifique el valor de retorno).

+0

OK, entonces, ¿qué error se devuelve? –

+0

"Si la función falla, el valor de retorno es cero". – Bill

+0

Aquí está la cita completa: "Si la función falla, el valor de retorno es cero. Para obtener información extendida sobre el error, llame a GetLastError". Entonces, habiendo llamado a GetLastError(), ¿cómo puedo distinguir esta condición de error de otros errores que pueden ocurrir? –

Cuestiones relacionadas