Partager via


KeReleaseMutex, fonction (wdm.h)

La routine KeReleaseMutex libère un objet mutex et spécifie si l’appelant doit appeler l’une des routines KeWaitXxx dès que KeReleaseMutex retourne le contrôle.

Syntaxe

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

Paramètres

[in, out] Mutex

Pointeur vers un objet mutex initialisé pour lequel l’appelant fournit le stockage.

[in] Wait

Spécifie si l’appel à KeReleaseMutex doit être immédiatement suivi d’un appel à l’une des routines KeWaitXxx . Si la valeur est TRUE, l’appel KeReleaseMutex doit être suivi d’un appel à KeWaitForMultipleObjects, KeWaitForMutexObject ou KeWaitForSingleObject. Pour plus d'informations, consultez la section Notes qui suit.

Valeur retournée

Si la valeur de retour est zéro, l’objet mutex a été libéré et a atteint un état de signal.

Remarques

Pour de meilleures performances, utilisez des mutex rapides ou des mutex surveillés. Pour plus d’informations, consultez Alternatives aux objets Mutex.

Si l’objet mutex atteint un état signalé, une tentative est effectuée pour satisfaire une attente pour l’objet mutex.

Un objet mutex peut être libéré uniquement par le thread qui contient actuellement le mutex. Si une tentative est effectuée pour libérer un mutex que le thread ne contient pas ou si un mutex a été acquis à IRQL = DISPATCH_LEVEL et que le thread ne s’exécute pas à DISPATCH_LEVEL (et vice versa), la routine déclenche une exception STATUS_ABANDONED ou STATUS_MUTEX_NOT_OWNED.

Lorsqu’un objet mutex atteint un état signalé, il est supprimé de la liste des mutex qui sont conservés par ce thread. Si cette liste ne contient plus d’entrées, la priorité d’origine pour le thread est restaurée.

La routine KeReleaseMutex peut déclencher temporairement l’IRQL. Si le paramètre Wait a la valeur FALSE, la routine, avant de retourner, restaure l’IRQL à la valeur d’origine qu’elle avait au début de l’appel.

Si l’argument Wait = TRUE est attendu, la routine retourne sans abaisser l’IRQL. Dans ce cas, l’appel KeReleaseMutex doit être immédiatement suivi d’un appel KeWaitXxx . En définissant Wait = TRUE, l’appelant peut empêcher un changement de contexte inutile entre l’appel KeReleaseMutex et l’appel KeWaitXxx . La routine KeWaitXxx , avant de retourner, restaure l’IRQL à sa valeur d’origine au début de l’appel KeReleaseMutex . Bien que l’IRQL désactive les commutateurs de contexte entre les deux appels, ces appels ne peuvent pas être utilisés de manière fiable comme début et fin d’une opération atomique. Par exemple, entre ces deux appels, un thread qui s’exécute en même temps sur un autre processeur peut modifier l’état de l’objet d’événement ou de la cible de l’attente.

Si l’appelant s’exécute à IRQL = DISPATCH_LEVEL ou dans un contexte de thread arbitraire, le paramètre Timeout de KeWaitXxx doit être égal à zéro.

Si un mutex est acquis de manière récursive, le thread de conservation doit appeler KeReleaseMutex autant de fois qu’il a acquis le mutex pour le définir à l’état signalé.

Pour plus d’informations sur les objets mutex, consultez Objets Mutex.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Disponible à partir de Windows 2000.
Plateforme cible Universal
En-tête wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
Règles de conformité DDI HwStorPortProhibitedDDIs(storport), IrqlKeDispatchLte(wdm)

Voir aussi

ExReleaseFastMutex

ExReleaseFastMutexUnsafe

KeInitializeMutex

KeReadStateMutex

KeWaitForMultipleObjects

KeWaitForSingleObject