在一个调度例程中,我们有以下代码:
if (DeviceExtension->Flag)
{
KeAcquireInStackQueuedSpinLockAtDpcLevel(&DeviceExtension->SpinLock, &LockHandle);
//... when we will enter here, DeviceExtension->Flag can already be set to FALSE.
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
}
在另一个调度例程中,我们有以下代码:
KeAcquireInStackQueuedSpinLockAtDpcLevel(&DeviceExtension->SpinLock, &LockHandle);
//...
DeviceExtension->Flag = FALSE;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
因此,当我们将在第一个调度例程中获取自旋锁时,DeviceExtension->Flag
已经可以FALSE
由第二个例程设置。解决方案是获取自旋锁,然后检查DeviceExtension->Flag
. 但是DeviceExtension->Flag
可能是 FALSE,在这种情况下,自旋锁获取似乎非常繁重。
我对多线程不是很熟悉,尤其是在内核模式下。我知道这个问题很愚蠢,但我迷路了。在这种情况下,正确的解决方案是什么?谢谢你。