한 디스패치 루틴 내부를 회전 우리는 다음과 같은 코드가 있습니다 때 우리가 있도록Windows 드라이버, 잠금 수집 및 조건 테스트
KeAcquireInStackQueuedSpinLockAtDpcLevel(&DeviceExtension->SpinLock, &LockHandle);
//...
DeviceExtension->Flag = FALSE;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
: 우리는 다음과 같은 코드가 다른 디스패치 루틴 내부
if (DeviceExtension->Flag)
{
KeAcquireInStackQueuedSpinLockAtDpcLevel(&DeviceExtension->SpinLock, &LockHandle);
//... when we will enter here, DeviceExtension->Flag can already be set to FALSE.
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
}
을 첫 번째 디스패치 루틴 내에서 스핀 록을 획득하려면 DeviceExtension->Flag
을 두 번째 루틴으로 이미 FALSE
으로 설정할 수 있습니다. 해결책은 스핀 록을 획득 한 다음 DeviceExtension->Flag
을 확인하는 것입니다. 그러나 DeviceExtension->Flag
은 FALSE 일 수 있으며 스핀 잠금 획득은이 경우 매우 무겁습니다.
특히 커널 모드에서 멀티 스레딩에 익숙하지 않습니다. 나는 그 질문이 어리 석다는 것을 알고 있지만, 나는 길을 잃었다. 이 경우 올바른 해결책은 무엇입니까? 고맙습니다.
방금해야 할 것 같네요에서 호출해야한다는 주장 [재확인 잠금 (https://en.wikipedia.org/wiki/Double-checked_locking)? 첫 번째 스 니펫에서 잠금 후 플래그를 다시 확인하고 false이면 해제하고 중단합니다. – Blorgbeard
"프로그램 된대로"작동하고있는 것으로 보입니다. 두 번째 코드 단편은 FALSE로 설정 한 다음 그대로 유지합니다. 스핀 락이 당신을 보장하고있는 유일한 방법은'KeAcquireInStackQueuedSpinLockAtDpcLevel'와'KeReleaseInStackQueuedSpinLockFromDpcLevel'에 대한 호출 사이의 "동기화 된"접근 일 것입니다. 아마도 두 번째 루틴의 끝에 플래그를 다시 TRUE로 설정하고 싶습니까? – rogerdpack
아니요, 실제로이 플래그는 장치가 제거되어야 함을 나타내므로 한 방향으로 작동합니다. – igntec