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。 有关详细信息,请参阅以下“备注”部分。

返回值

如果返回值为零,则释放互斥体对象并达到 信号的状态。

言论

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

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

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

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

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

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

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

如果以递归方式获取互斥体,则保留线程必须调用 KeReleaseMutex 获取互斥体以将其设置为信号状态的次数。

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

要求

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

另请参阅

ExReleaseFastMutex

ExReleaseFastMutexUnsafe

KeInitializeMutex

KeReadStateMutex

KeWaitForMultipleObjects

KeWaitForSingleObject