Когда вы используете обычные блокировки (мьютексы, критические секции и т. Д.), Операционная система переводит ваш поток в состояние WAIT, а выгружает , планируя другие потоки на том же ядре. Это снижает производительность, если время ожидания действительно мало, потому что ваш поток теперь должен ждать упреждения, чтобы снова получить время ЦП.
Кроме того, объекты ядра доступны не во всех состояниях ядра, например, в обработчике прерываний или при недоступности подкачки и т. Д.
Спинлоки не вызывают вытеснения, а ждут в цикле («вращение»), пока другое ядро не снимет блокировку. Это предотвращает потерю потоком кванта и продолжится, как только будет снята блокировка. Простой механизм спин-блокировки позволяет ядру использовать его практически в любом состоянии.
Вот почему на одноядерном компьютере спин-блокировка - это просто «отключение прерываний» или «повышение IRQL», которое полностью предотвращает планирование потоков.
Спин-блокировки в конечном итоге позволяют ядрам избегать «больших блокировок ядра» (блокировки, получаемой при входе в ядро и освобождаемой при выходе) и имеют детальную блокировку примитивов ядра, вызывая лучшую многопроцессорность на многоядерных машинах, таким образом повышая производительность .
РЕДАКТИРОВАТЬ: возник вопрос: "Значит ли это, что я должен использовать спин-блокировки везде, где это возможно?" и я постараюсь ответить на него:
Как я уже упоминал, спин-блокировки полезны только в тех местах, где ожидаемое время ожидания короче кванта (читай: миллисекунды), и выгрузка не имеет большого смысла (например, объекты ядра недоступны).
Если время ожидания неизвестно или вы находитесь в пользовательском режиме, спин-блокировки не эффективны. Вы потребляете 100% процессорного времени на ядре ожидания, проверяя, доступна ли спин-блокировка. Вы не позволяете другим потокам работать на этом ядре, пока не истечет ваш квант. Этот сценарий возможен только для коротких пакетов на уровне ядра и маловероятен для приложения в пользовательском режиме.
Вот вопрос на SO, касающийся того: Спинлоки, насколько они полезны?