NdisDprAcquireReadWriteLock 함수(ndis.h)

NdisDprAcquireReadWriteLock 함수는 호출자가 드라이버 스레드 간에 공유되는 리소스에 대한 쓰기 또는 읽기 액세스에 사용하는 잠금을 획득합니다.

참고 읽기-쓰기 잠금 인터페이스는 NdisDprAcquireReadWriteLock 대신 NdisAcquireRWLockRead 또는 NdisAcquireRWLockWrite(Flags 매개 변수에서 NDIS_RWL_AT_DISPATCH_LEVEL 설정)를 사용해야 하는 NDIS 6.20 이상 드라이버에서는 사용되지 않습니다.
 

구문

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

매개 변수

[in, out] Lock

잠금을 나타내는 불투명 변수에 대한 포인터입니다. 호출자는 이 잠금을 사용하여 공유 리소스에 액세스할 수 있습니다.

[in] fWrite

부울 값입니다. 값이 TRUE이면 이 함수는 공유 리소스에 대한 쓰기 액세스 권한이 제공됩니다. 값이 FALSE이면 이 함수에 읽기 권한이 제공됩니다.

[out] LockState

잠금 상태를 추적하는 불투명 변수에 대한 포인터입니다. 이 변수는 호출자가 잠금을 획득하고 해제하는 시간 사이의 간격에 존재합니다. 호출자는 동일한 비 ISR 드라이버 스레드에서 잠금을 획득하려는 각 시도에 대해 LOCK_STATE 형식의 다른 변수를 사용해야 합니다.

반환 값

None

설명

드라이버는 다음을 사용하여 NDIS_RW_LOCK 형식의 변수를 초기화해야 합니다.드라이버가 다른 NdisXxx ReadWriteLock 함수를 호출하기 전에 NdisInitializeReadWriteLock 함수입니다. 드라이버는 사용하는 잠금에 대한 상주 스토리지를 제공해야 합니다.

NdisDprAcquireReadWriteLock을 사용하여 잠금을 획득한 후 호출자는 NdisDprReleaseReadWriteLock 함수를 호출하여 해당 잠금을 해제해야 합니다. 잠금의 참조 수를 감소하려면 드라이버가 호출해야 합니다.
NdisDprAcquireReadWriteLock 에 대한 각 호출에 대해 NdisDprReleaseReadWriteLock을 한 번 만듭니다.

동일한 잠금에서 NdisDprAcquireReadWriteLockNdisDprAcquireReadWriteLock 을 모두 사용하는 것이 안전합니다. 그러나 NdisDprAcquireReadWriteLock을 사용하여 잠금을 획득하는 경우 NdisDprReleaseReadWriteLock을 사용하여 잠금을 해제해야 하므로 호출의 균형이 조정되어야 합니다. 마찬가지로 NdisAcquireReadWriteLock을 사용하여 잠금을 획득하는 경우 NdisReleaseReadWriteLock을 사용하여 잠금을 해제해야 합니다.

일부 아키텍처에서는 NdisDprAcquireReadWriteLockNdisAcquireReadWriteLock보다 빠르게 수행됩니다. 드라이버는 현재 IRQL이 이미 DISPATCH_LEVEL 확신하는 경우 NdisAcquireReadWriteLock 대신 NdisDprAcquireReadWriteLock을 사용할 수 있습니다. 그러나 필수는 아닙니다. KeGetCurrentIrql 함수를 호출하는 오버헤드는 NdisAcquireReadWriteLock 대신 NdisDprAcquireReadWriteLock을 호출할 의 성능 이점보다 큽니다.

드라이버 스레드 간에 공유되는 리소스를 수정하려면 드라이버 스레드가 쓰기 잠금을 획득해야 합니다. 이러한 리소스를 모니터링하기 위해 드라이버 스레드는 읽기 전용 잠금을 획득해야 합니다. 읽기 액세스에는 스핀 잠금에 대한 연동 작업 또는 경합이 필요하지 않습니다. 읽기 전용 액세스를 사용하면 운영 체제 및 드라이버 성능을 유지하는 데 도움이 됩니다.

드라이버 스레드는 25 마이크로초 이상 쓰기 잠금을 유지해서는 안 됩니다. 장기간 쓰기 잠금을 유지하면 운영 체제와 드라이버 성능이 모두 저하됩니다.

드라이버는 잠금을 사용하여 다른 함수가 MiniportInterrupt 및/또는와 공유하는 읽기 또는 쓰기 액세스로부터 리소스를 보호할 수 없습니다. MiniportDisableInterruptEx 함수입니다. 대신 드라이버는 NdisMSynchronizeWithInterruptEx 를 호출해야 합니다. MiniportSynchronizeInterrupt 함수는 해당 공유 리소스가 있는 동일한 DIRQL에서 이러한 공유 리소스에 액세스합니다.
MiniportInterrupt 및/또는 MiniportDisableInterruptEx 함수는 수행합니다.

NDIS 스핀 잠금 획득 및 해제에 대한 자세한 내용은 네트워크 드라이버의 동기화 및 알림을 참조하세요.

요구 사항

   
지원되는 최소 클라이언트 NdisDprAcquireReadWriteLock 대신 NdisAcquireRWLockRead 또는 NdisAcquireRWLockWrite를 사용해야 하는 NDIS 6.20 이상 드라이버에서는 사용되지 않습니다. NDIS 6.0 및 6.1에서 지원됩니다.
대상 플랫폼 유니버설
헤더 ndis.h(Ndis.h 포함)
라이브러리 Ndis.lib
IRQL = DISPATCH_LEVEL

참고 항목

LOCK_STATE

MiniportDisableInterruptEx

MiniportInterrupt

MiniportSynchronizeInterrupt

NdisAcquireRWLockRead

NdisAcquireRWLockWrite

NdisDprReleaseReadWriteLock

NdisInitializeReadWriteLock

NdisMSynchronizeWithInterruptEx