Поделиться через


0xF проверки ошибок: SPIN_LOCK_ALREADY_OWNED

Проверка ошибок SPIN_LOCK_ALREADY_OWNED имеет значение 0x0000000F. Это означает, что запрос на спин-блокировку был инициирован, когда спиновая блокировка уже принадлежала.

Важно!

Эта статья предназначена для программистов. Если вы являетесь клиентом, который получил код ошибки "синий экран" во время работы с компьютером, см. статью Устранение ошибок синего экрана.

Параметры SPIN_LOCK_ALREADY_OWNED

Нет

Причина

Как правило, эта ошибка вызвана рекурсивным запросом на блокировку спина. Это также может произойти, если был инициирован нечто подобное рекурсивному запросу для блокировки спина, например, когда поток получил спиновую блокировку, а затем тот же поток вызывает функцию, которая также пытается получить спин-блокировку. Вторая попытка получить спин-блокировку в этом случае не блокируется, так как это приведет к неустранимой взаимоблокировке. Если вызовы выполняются на нескольких процессорах, то один процессор будет заблокирован до тех пор, пока другой процессор не спустит блокировку.

Эта ошибка также может возникать без явной рекурсии, когда всем потокам и всем спин-блокировкам назначается IRQL. Списки IRQL спин-блокировки всегда больше или равны уровню DPC, но это не относится к потокам. Однако поток, удерживающий блокировку спина, должен поддерживать значение IRQL больше или равное значению спин-блокировки. Уменьшение потока IRQL ниже уровня IRQL блокировки спина, которое он удерживает, позволяет запланировать другой поток на процессоре. Затем этот новый поток может попытаться получить ту же блокировку спина.

Решение

Убедитесь, что блокировка не получена рекурсивно. Кроме того, для потоков, содержащих спин-блокировку, убедитесь, что поток IRQL не уменьшается до уровня ниже IRQL блокировки спина, которую он удерживает.