我有一个KSPIN_LOCK
,它在PsCreateSystemThread
驱动程序的主线程和我用PsCreateSystemThread
创建的一些线程之间共享。问题是,如果我试图获得自旋锁,而不解除阻塞,则主线程阻塞。我很困惑为什么会这样..。据我所知,这可能与主线程在驱动程序IRQL上运行,而其他线程在PASSIVE_LEVEL上运行这一事实有关。
注意:如果我只运行主线程,那么获取/释放锁就可以了。
注意:我使用函数KeAcquireSpinLock
和KeReleaseSpinLock
来获取/释放锁。
发布于 2019-04-04 16:19:11
这是我的“卡住”自旋锁的清单:
使用驱动程序验证程序可以轻松和自动地发现其中的一些问题;如果您还没有使用它,请使用它。如果您将自旋锁封装在一个添加自己断言的小助手中,则可能会发现其他问题。例如:
typedef struct _MY_LOCK {
KSPIN_LOCK Lock;
ULONG OwningProcessor;
KIRQL OldIrql;
} MY_LOCK;
void MyInitialize(MY_LOCK *lock) {
KeInitializeSpinLock(&lock->Lock);
lock->OwningProcessor = (ULONG)-1;
}
void MyAcquire(MY_LOCK *lock) {
ULONG current = KeGetCurrentProcessorIndex();
NT_ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
NT_ASSERT(current != lock->OwningProcessor); // check for recursion
KeAcquireSpinLock(&lock->Lock, &lock->OldIrql);
NT_ASSERT(lock->OwningProcessor == (ULONG)-1); // check lock was inited
lock->OwningProcessor = current;
}
void MyRelease(MY_LOCK *lock) {
NT_ASSERT(KeGetCurrentProcessorIndex() == lock->OwningProcessor);
lock->OwningProcessor = (ULONG)-1;
KeReleaseSpinLock(&lock->Lock, lock->OldIrql);
}
KSPIN_LOCK的包装器很常见。KSPIN_LOCK就像一款赛车,它的所有可选功能都被去掉,以最大限度地提高原始速度。如果你不计算微秒,你可能会合理地决定增加加热的座位和调频收音机,包装在上面这样的低水平KSPIN_LOCK。(如果你需要的话,使用#ifdefs的魔力,你总是可以把安全气囊从你的零售建筑中拿出来。)
https://stackoverflow.com/questions/55505845
复制相似问题