KeReleaseMutex 函数 (wdm.h)

KeReleaseMutex 例程释放互斥对象,并指定调用方是否在 KeReleaseMutex 返回控件后立即调用 KeWaitXxx 例程之一。

语法

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

参数

[in, out] Mutex

指向调用方为其提供存储的已初始化互斥对象的指针。

[in] Wait

指定是否在调用 KeReleaseMutex 后立即调用 KeWaitXxx 例程之一。 如果 为 TRUE则 KeReleaseMutex 调用后必须依次调用 KeWaitForMultipleObjectsKeWaitForMutexObjectKeWaitForSingleObject。 有关更多信息,请参见下面的“备注”部分。

返回值

如果返回值为零,则释放互斥对象并获取 信号状态。

注解

为了获得更好的性能,请使用快速互斥体或受保护的互斥体。 有关详细信息,请参阅 Mutex 对象的替代项

如果互斥对象达到信号状态,则尝试满足互斥对象的等待。

互斥对象只能由当前持有互斥体的线程释放。 如果尝试释放线程不持有的互斥体,或者如果在 IRQL = DISPATCH_LEVEL 处获取互斥体,并且该线程未在DISPATCH_LEVEL (运行,) 反之亦然,则例程将引发STATUS_ABANDONED或STATUS_MUTEX_NOT_OWNED异常。

当互斥对象达到信号状态时,该对象将从该线程持有的互斥体列表中删除。 如果此列表不包含更多条目,则还原线程的原始优先级。

KeReleaseMutex 例程可能会暂时引发 IRQL。 如果 Wait 参数为 FALSE,则例程在返回之前会将 IRQL 还原到调用开始时的原始值。

如果 等待 = TRUE,则例程返回而不降低 IRQL。 在这种情况下, KeReleaseMutex 调用必须紧跟 KeWaitXxx 调用。 通过设置 等待 = TRUE,调用方可以防止 在 KeReleaseMutex 调用和 KeWaitXxx 调用之间发生不必要的上下文切换。 KeWaitXxx 例程在返回之前,会将 IRQL 还原到 KeReleaseMutex 调用开始时的原始值。 尽管 IRQL 禁用两个调用之间的上下文切换,但这些调用不能可靠地用作原子操作的开始和结束。 例如,在这两次调用之间,在另一个处理器上同时运行的线程可能会更改事件对象或等待目标的状态。

如果调用方在 IRQL = DISPATCH_LEVEL 或在任意线程上下文中执行,则 KeWaitXxxTimeout 参数必须为零。

如果以递归方式获取互斥体,则持有线程必须调用 KeReleaseMutex 的次数与获取互斥锁的次数一样多,以将其设置为信号状态。

有关互斥对象的详细信息,请参阅 互斥对象

要求

要求
最低受支持的客户端 从 Windows 2000 开始可用。
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport) IrqlKeDispatchLte (wdm)

另请参阅

ExReleaseFastMutex

ExReleaseFastMutexUnsafe

KeInitializeMutex

KeReadStateMutex

KeWaitForMultipleObjects

KeWaitForSingleObject