Поделиться через


Функция NdisAcquireReadWriteLock (ndis.h)

Функция NdisAcquireReadWriteLock получает блокировку, которую вызывающий объект использует для записи или чтения доступа к ресурсам, которые совместно используются потоками драйвера.

Примечание Интерфейс блокировки чтения и записи не рекомендуется использовать для драйверов NDIS 6.20 и более поздних версий, которые должны использовать NdisAcquireRWLockRead или NdisAcquireRWLockWrite вместо NdisAcquireReadWriteLock.
 

Синтаксис

void NdisAcquireReadWriteLock(
  [in, out] PNDIS_RW_LOCK Lock,
  [in]      BOOLEAN       fWrite,
  [_out_]   PLOCK_STATE   LockState
);

Параметры

[in, out] Lock

Указатель на непрозрачную переменную, представляющую блокировку. Вызывающий объект может использовать эту блокировку для доступа к общим ресурсам.

[in] fWrite

Значение типа Boolean. Если значение равно TRUE, этой функции предоставляется доступ на запись к общим ресурсам; Если значение равно FALSE, эта функция предоставляется с доступом на чтение.

[_out_] LockState

LockState. Указатель на непрозрачную переменную, которая отслеживает состояние блокировки. Эта переменная существует в интервале между временем, когда вызывающий объект получает и снимает блокировку. Вызывающий объект должен использовать другую переменную типа LOCK_STATE для каждой попытки получить блокировку из одного потока драйвера, отличного от ISR.

Возвращаемое значение

None

Remarks

Драйвер должен инициализировать переменную типа NDIS_RW_LOCK с помощью Функция NdisInitializeReadWriteLock перед тем, как драйвер вызывает любую другую функцию NdisXxxReadWriteLock. Драйвер должен предоставить резидентные хранилища для блокировок, которые он использует.

После получения блокировки с помощью NdisAcquireReadWriteLock вызывающий объект должен освободить ее, вызвав Функция NdisReleaseReadWriteLock . Чтобы уменьшать число ссылок блокировки, драйвер должен вызвать
NdisReleaseReadWriteLock один раз для каждого вызова NdisAcquireReadWriteLock.

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

Поток драйвера никогда не должен удерживать блокировку записи более 25 микросекунд. Длительное хранение блокировки записи снижает производительность операционной системы и драйвера.

Драйвер не может использовать блокировку для защиты ресурсов от доступа на чтение или запись, которые его другие функции совместно используют с MiniportInterrupt и (или) Функции MiniportDisableInterruptEx . Вместо этого драйвер должен вызвать NdisMSynchronizeWithInterruptEx , чтобы егоФункция MiniportSynchronizeInterrupt обращается к таким общим ресурсам в том же DIRQL, в котором он
MiniportInterrupt и/или Функции MiniportDisableInterruptEx выполняют.

NdisAcquireReadWriteLock всегда вызывает IRQL. Для операции записи NdisAcquireReadWriteLock вызывает IRQL путем получения спин-блокировки. Для операции чтения NdisAcquireReadWriteLock явно вызывает IRQL до IRQL = DISPATCH_LEVEL.

Дополнительные сведения о получении и освобождении спин-блокировок NDIS см. в разделе Синхронизация и уведомление в сетевых драйверах.

Требования

Требование Значение
Минимальная версия клиента Устарело для драйверов NDIS 6.20 и более поздних версий, в которых следует использовать NdisAcquireRWLockRead или NdisAcquireRWLockWrite. Поддерживается для драйверов NDIS 6.0 и NDIS 5.1 (см. раздел NdisAcquireReadWriteLock (NDIS 5.1)) в Windows Vista. Поддерживается для драйверов NDIS 5.1 (см. раздел NdisAcquireReadWriteLock (NDIS 5.1)) в Windows XP.
Целевая платформа Универсальное
Верхняя часть ndis.h (включая Ndis.h)
Библиотека Ndis.lib
DLL Ndis.sys
IRQL <= DISPATCH_LEVEL
Правила соответствия DDI Irql_Synch_Function(ndis)

См. также раздел

MiniportDisableInterruptEx

MiniportInterrupt

MiniportSynchronizeInterrupt

NdisAcquireRWLockRead

NdisAcquireRWLockWrite

NdisInitializeReadWriteLock

NdisMSynchronizeWithInterruptEx

NdisReleaseReadWriteLock