Необработанный spin_lock
может использоваться, когда вы не знаете, что прерывания или нижние половины когда-либо будут бороться за блокировку. Избегая маскирования прерываний, вы уменьшаете задержку прерывания, в то же время избегая накладных расходов на мьютекс для критических секций, достаточно коротких для вращения.
На практике они, по-видимому, в основном используются такими вещами, как драйверы файловой системы, для блокировки структур внутреннего кэша и другими вещами, в которых нет необходимости блокировать ввод-вывод при удержании блокировки. Поскольку задние половины и прерывания драйвера никогда не касаются драйвера FS напрямую, нет необходимости маскировать прерывания.
Я подозреваю, что эквивалент Windows будет CRITICAL_SECTION
, или каким-либо другим эквивалентом API ядра NT; однако, в отличие от критической секции NT, спин-блокировки Linux не возвращаются к мьютексу, когда утверждаются; они просто вращаются.
И, да, spin_unlock_bh
безусловно восстанавливает нижние половины. Вы можете либо отслеживать, когда включать / отключать вручную (поскольку вы обычно должны снимать блокировки в обратном порядке получения, это обычно не проблема), либо просто прибегнуть к spin_lock_irqsave
.