ERESOURCE 例程简介
系统提供用于获取和释放 ERESOURCE 结构的例程,以及检查其当前状态。
获取和发布 ERESOURCE 结构
驱动程序可以使用 ERESOURCE 结构来实现 独占/共享同步。 独占/共享同步的工作原理如下:
任意数量的线程都可以获取共享的 ERESOURCE。
只有一个线程可以独占方式获取 ERESOURCE。 仅当没有线程已将其作为共享获取时,才能以独占方式获取 ERESOURCE。
可以选择将当前无法获取 ERESOURCE 的线程置于等待状态,直到可以获取 ERESOURCE。 系统维护等待 ERESOURCE 的两个线程列表: 排他服务员 列表和 共享服务员列表。
独占/共享同步的典型用途是实现读/写锁。 读/写锁允许多个线程执行读取操作,但一次只能有一个线程写入。 这可以直接在获取 ERESOURCE 方面实现。
驱动程序为 ERESOURCE 分配存储,并使用 ExInitializeResourceLite 对其进行初始化。 系统维护正在使用的所有 ERESOURCE 结构的列表。 当驱动程序不再需要特定的 ERESOURCE 时,它必须调用 ExDeleteResourceLite 以将其从系统列表中删除。 驱动程序还可以通过调用 ExReinitializeResourceLite 重用 ERESOURCE。
驱动程序可以在 ERESOURCE 上执行以下基本操作:
获取与 ExAcquireResourceSharedLite 共享的 ERESOURCE。 仅当资源尚未以独占方式获取并且没有排他服务员时,此例程才会获取资源。
仅使用 ExAcquireResourceExclusiveLite 获取 ERESOURCE。 只要未以独占方式或共享方式获取资源,此例程就获取资源。
使用 ExConvertExclusiveToSharedLite 将独占收购转换为共享收购。
使用 ExReleaseResourceLite 释放获取的资源。
ExAcquireResourceSharedLite 和 ExAcquireResourceExclusiveLite 的 Wait 参数确定当前线程是否等待获取 ERESOURCE。 如果指定值为 FALSE 并且无法获取 ERESOURCE,则例程返回 FALSE。 如果指定值为 TRUE,则当前线程将放在 ERESOURCE 的相应等待列表中。
检查 ERESOURCE 结构的状态
驱动程序还可以确定 ERESOURCE 的当前状态,如下所示:
使用 ExIsResourceAcquiredLite 或 ExIsResourceAcquiredSharedLite 确定 ERESOURCE 是否已作为共享或独占获取。 使用 ExIsResourceAcquiredExclusiveLite 检查 ERESOURCE 是否已专门获得。
使用 ExGetSharedWaiterCount 确定 ERESOURCE 的共享服务员数,并使用 ExGetExclusiveWaiterCount 确定 ERESOURCE 的独占服务员数。