Спинлоки используются в сценариях с высоким Irql, когда вы не можете передать свой квант планировщику.
Так, например, когда вы хотите заблокировать некоторую структуру данных (вне прерываний), вы получаете мьютекс. Когда мьютекс принадлежит кому-то другому, ваш поток помещается в список ожидания в планировщике, пока мьютекс не будет освобожден. Затем он получает право собственности на мьютекс, и все остальные потоки, обращающиеся к нему, усыпляются, когда они пытаются получить мьютекс.
Когда вы находитесь в прерывании, вы не можете этого сделать. У вас нет контекста потока, и это прерывание нельзя откладывать «на неопределенный срок». Но иногда вам нужен доступ к общим данным внутри прерывания. Когда в системе присутствует более одного ЦП, несколько прерываний и потоков могут работать одновременно. Поэтому вы должны защищать рабочие очереди, общие объекты и т. Д., Чтобы они не были повреждены. Для этого вы используете спин-блокировки.
Поскольку политика заключается в том, чтобы делать как можно меньше вещей внутри секции, защищенной спин-блокировкой, вы можете ожидать, что не будет проблем с вращением на самой блокировке только в течение пары циклов, пока ее не освободит владелец.
Итак, что из этого следует, что когда вы получаете доступ к общим данным из прерывания, у вас есть для использования спин-блокировки, потому что нет других примитивов, которые могут быть б.
И, как уже отмечалось, всегда держите спинлок только в течение очень небольшого промежутка времени.