Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается структура ERESOURCE и системные подпрограммы, которые работают с ним. Структуры ERESOURCE можно использовать для реализации блокировки чтения и записи в драйвере.
Структура ERESOURCE
Структура ERESOURCE используется для управления доступом к общим ресурсам. Он предоставляет механизм синхронизации доступа к ресурсам, которые можно совместно использовать между несколькими потоками.
Структура ERESOURCE непрозрачна; то есть ее члены зарезервированы для системного использования.
Хранилище для ERESOURCE должно быть выделено из непагрегированного пула.
Рутинные операции 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.
Параметр Wait в функциях ExAcquireResourceSharedLite и ExAcquireResourceExclusiveLite определяет, будет ли текущий поток ожидать получения ERESOURCE. Если указать значение FALSE и ERESOURCE не удается получить, подпрограмма возвращает значение FALSE. Если указать значение TRUE, текущий поток помещается в соответствующий список ожидания для ERESOURCE.
Изучение состояния структуры ERESOURCE
Драйвер также может определить текущее состояние ERESOURCE следующим образом:
Используйте ExIsResourceAcquiredLite или ExIsResourceAcquiredSharedLite, чтобы определить, был ли ERESOURCE уже захвачен в режиме общего или эксклюзивного доступа. Используйте ExIsResourceAcquiredExclusiveLite , чтобы проверить, был ли ERESOURCE специально приобретен исключительно.
Используйте ExGetSharedWaiterCount , чтобы определить количество общих официантов для ERESOURCE и использовать ExGetExclusiveWaiterCount , чтобы определить количество эксклюзивных официантов для ERESOURCE.