Общие сведения о подпрограммах ERESOURCE

Система предоставляет процедуры для получения и освобождения структур ERESOURCE, а также для проверки их текущего состояния.

Получение и освобождение структуры ERESOURCE

Драйверы могут использовать структуры ERESOURCE для реализации монопольной и общей синхронизации. Монопольная и общая синхронизация работает следующим образом:

  • Любое количество потоков может получить ERESOURCE как общий.

  • Только один поток может получить только ERESOURCE. ERESOURCE можно получить только в том случае, если ни в каких потоках он не был получен как общий.

Поток, который в настоящее время не может получить ERESOURCE, при необходимости может быть помещен в состояние ожидания, пока не удастся получить ERESOURCE. Система поддерживает два списка потоков, ожидающих ERESOURCE: список эксклюзивных официантов и список общих официантов.

Обычно для монопольной и общей синхронизации используется блокировка чтения и записи. Блокировка чтения и записи позволяет нескольким потокам выполнять операцию чтения, но только один поток может записывать одновременно. Это можно реализовать непосредственно с точки зрения получения ERESOURCE.

Драйвер выделяет хранилище для ERESOURCE и инициализирует его с помощью ExInitializeResourceLite. Система ведет список всех используемых структур ERESOURCE. Если драйверу больше не требуется определенный ERESOURCE, он должен вызвать ExDeleteResourceLite , чтобы удалить его из списка системы. Драйвер также может повторно использовать ERESOURCE, вызвав ExReinitializeResourceLite.

Драйверы могут выполнять следующие основные операции с ERESOURCE:

  • Получите ERESOURCE, предоставленный exAcquireResourceSharedLite. Эта подпрограмма получает ресурс только в том случае, если ресурс не был получен исключительно и нет эксклюзивных официантов.

  • Приобретите ERESOURCE исключительно с помощью ExAcquireResourceExclusiveLite. Эта подпрограмма получает ресурс до тех пор, пока он не был приобретен исключительно или совместно.

  • Преобразуйте эксклюзивное приобретение в совместное приобретение с помощью ExConvertExclusiveToSharedLite.

  • Освободить полученный ресурс с помощью ExReleaseResourceLite.

Параметр WaitexAcquireResourceSharedLite и ExAcquireResourceExclusiveLite определяет, ожидает ли текущий поток получения ERESOURCE. Если вы укажете значение FALSE и ERESOURCE не удается получить, подпрограмма возвращает значение FALSE. Если указать значение TRUE, текущий поток помещается в соответствующий список ожидания для ERESOURCE.

Изучение состояния структуры ERESOURCE

Драйвер также может определить текущее состояние ERESOURCE следующим образом:

  • Используйте ExIsResourceAcquiredLite или ExIsResourceAcquiredSharedLite , чтобы определить, был ли ERESOURCE уже приобретен как общий или эксклюзивный. Используйте ExIsResourceAcquiredExclusiveLite, чтобы проверка, был ли ERESOURCE приобретен исключительно.

  • Используйте ExGetSharedWaiterCount , чтобы определить количество общих официантов для ERESOURCE, и ExGetExclusiveWaiterCount для определения количества эксклюзивных официантов для ERESOURCE.