排队的自旋锁

排队自旋锁 是自旋锁的变体,在多处理器计算机上更高效地进行争用锁定。 在多处理器计算机上,使用排队的自旋锁可保证处理器先按首先处理的方式获取自旋锁。 Windows XP 和更高版本的 Windows 的驱动程序应使用排队自旋锁,而不是普通的旋转锁。

驱动程序为自旋锁提供存储,并将其初始化为 KeInitializeSpinLock。 驱动程序使用 KeAcquireInStackQueuedSpinLock 获取排队自旋锁,并使用 KeReleaseInStackQueuedSpinLock 将其释放。

驱动程序会分配一个通过指向KeAcquireInStackQueuedSpinLock的指针传递的KLOCK_QUEUE_HANDLE结构。 驱动程序在释放旋转锁时,通过指向 KeReleaseInStackQueuedSpinLock 的指针传递相同的结构。 通常,在每次获取锁定时,驱动程序都应在堆栈上分配结构。

驱动程序不得将对排队自旋锁例程和普通 KeXxx旋转锁 例程的调用混合到同一个自旋锁上。

如果驱动程序已处于 IRQL = DISPATCH_LEVEL,则可以改为调用 KeAcquireInStackQueuedSpinLockAtDpcLevelKeReleaseInStackQueuedSpinLockFromDpcLevel