Compartir a través de


Función KeReleaseMutex (wdm.h)

La rutina KeReleaseMutex libera un objeto de exclusión mutua y especifica si el autor de la llamada debe llamar a una de las rutinas KeWaitXxx en cuanto KeReleaseMutex devuelve el control.

Sintaxis

LONG KeReleaseMutex(
  [in, out] PRKMUTEX Mutex,
  [in]      BOOLEAN  Wait
);

Parámetros

[in, out] Mutex

Puntero a un objeto de exclusión mutua inicializado para el que el autor de la llamada proporciona el almacenamiento.

[in] Wait

Especifica si la llamada a KeReleaseMutex va a ir seguida inmediatamente de una llamada a una de las rutinas KeWaitXxx . Si es TRUE, la llamada a KeReleaseMutex debe ir seguida de una llamada a KeWaitForMultipleObjects, KeWaitForMutexObject o KeWaitForSingleObject. Para obtener más información, vea la sección Comentarios que se muestra más adelante.

Valor devuelto

Si el valor devuelto es cero, el objeto de exclusión mutua se liberó y alcanzó un estado de señalizado.

Comentarios

Para mejorar el rendimiento, use exclusión mutua rápida o exclusión mutua protegida. Para obtener más información, vea Alternativas a objetos de exclusión mutua.

Si el objeto de exclusión mutua alcanza un estado señalado, se intenta satisfacer una espera para el objeto de exclusión mutua.

Solo el subproceso que contiene la exclusión mutua puede liberar un objeto de exclusión mutua. Si se intenta liberar una exclusión mutua que el subproceso no contiene o si se adquirió una exclusión mutua en IRQL = DISPATCH_LEVEL y el subproceso no se ejecuta en DISPATCH_LEVEL (y viceversa), la rutina genera una excepción STATUS_ABANDONED o STATUS_MUTEX_NOT_OWNED.

Cuando un objeto de exclusión mutua alcanza un estado señalado, se quita de la lista de las exclusión mutuas que mantiene ese subproceso. Si esta lista no contiene más entradas, se restaura la prioridad original del subproceso.

La rutina KeReleaseMutex podría generar temporalmente el IRQL. Si el parámetro Wait es FALSE, la rutina, antes de devolverla, restaura el IRQL al valor original que tenía al principio de la llamada.

Si espera = TRUE, la rutina devuelve sin reducir el IRQL. En este caso, la llamada a KeReleaseMutex debe seguir inmediatamente una llamada a KeWaitXxx . Al establecer Wait = TRUE, el autor de la llamada puede impedir que se produzca un cambio de contexto innecesario entre la llamada KeReleaseMutex y la llamada KeWaitXxx . La rutina KeWaitXxx , antes de devolverla, restaura el IRQL a su valor original al principio de la llamada a KeReleaseMutex . Aunque IRQL deshabilita los modificadores de contexto entre las dos llamadas, estas llamadas no se pueden usar de forma confiable como inicio y final de una operación atómica. Por ejemplo, entre estas dos llamadas, un subproceso que se ejecuta al mismo tiempo en otro procesador podría cambiar el estado del objeto de evento o del destino de la espera.

Si el autor de la llamada se ejecuta en IRQL = DISPATCH_LEVEL o en un contexto de subproceso arbitrario, el parámetro Timeout en KeWaitXxx debe ser cero.

Si una exclusión mutua se adquiere de forma recursiva, el subproceso de retención debe llamar a KeReleaseMutex tantas veces como adquirió la exclusión mutua para establecerla en el estado señalado.

Para obtener más información sobre los objetos de exclusión mutua, vea Objetos de exclusión mutua.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible a partir de Windows 2000.
Plataforma de destino Universal
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
Reglas de cumplimiento de DDI HwStorPortProhibitedDIs(storport), IrqlKeDispatchLte(wdm)

Consulte también

ExReleaseFastMutex

ExReleaseFastMutexUnsafe

KeInitializeMutex

KeReadStateMutex

KeWaitForMultipleObjects

KeWaitForSingleObject