本文介绍 ERESOURCE 结构和针对它的系统提供的例程。 可以使用 ERESOURCE 结构在驱动程序中实现读/写锁定。
ERESOURCE 结构
ERESOURCE 结构用于管理对共享资源的访问。 它提供了一种机制,用于同步对可在多个线程之间共享的资源的访问。
ERESOURCE 结构本质上是不透明的,也就是说,它的成员是供系统使用而保留的。
ERESOURCE 的存储必须从非分页池中分配。
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 的排他服务员数。