之路教程 https://onitr oad .com

原因

通常,此错误是由对自旋锁的递归请求引起的。
如果已经启动了类似于对自旋锁的递归请求的事情,也可能发生这种情况——例如,当一个线程获取了自旋锁,然后该线程调用了一个函数,该函数也尝试获取自旋锁锁。
在这种情况下,第二次获取自旋锁的尝试不会被阻止,因为这样做会导致不可恢复的死锁。
如果调用是在多个处理器上进行的,那么一个处理器将被阻塞,直到另一个处理器释放锁。

当所有线程和所有自旋锁都分配了 IRQL 时,也可能发生此错误,而无需显式递归。
自旋锁 IRQL 始终大于或者等于 DPC 级别,但对于线程而言并非如此。
但是,持有自旋锁的线程必须保持大于或者等于自旋锁的 IRQL。
将线程 IRQL 降低到它所持有的自旋锁的 IRQL 级别以下允许在处理器上调度另一个线程。
这个新线程然后可以尝试获取相同的自旋锁。

Windows 蓝屏代码 0xF:SPIN_LOCK_ALREADY_OWNED

SPIN_LOCK_ALREADY_OWNED 错误检查的值为 0x0000000F。
这表明当自旋锁已经被拥有时,一个自旋锁的请求已经启动。

解决方法

确保我们没有递归获取锁。
并且,对于持有自旋锁的线程,确保我们没有将线程 IRQL 降低到低于它持有的自旋锁的 IRQL 的级别。

SPIN_LOCK_ALREADY_OWNED 参数

日期:2020-09-17 00:16:15 来源:oir作者:oir