错误检查 0xF:SPIN_LOCK_ALREADY_OWNED

SPIN_LOCK_ALREADY_OWNED 错误检查的值为 0x0000000F。 这表示在已拥有自旋锁的情况下启动了对自旋锁的请求。

重要

这篇文章适合程序员阅读。 如果你是在使用计算机时收到蓝屏错误代码的客户,请参阅蓝屏错误疑难解答

SPIN_LOCK_ALREADY_OWNED 参数

原因

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

在没有显式递归的情况下,当所有线程和所有自旋锁都分配了 IRQL 时,也可能发生此错误。 自旋锁 IRQL 始终大于或等于 DPC 级别,但对于线程来说并非如此。 但是,持有自旋锁的线程必须维护大于或等于自旋锁的 IRQL。 将线程 IRQL 降低到其持有的自旋锁的 IRQL 级别以下,可以在处理器上调度另一个线程。 然后,此新线程会尝试获取相同的自旋锁。

解决方法

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