Короткий ответ: спин-блокировка может быть лучше, если вы планируете удерживать блокировку в течение очень короткого интервала (например, не делать ничего, кроме увеличения счетчика), и конкуренция, как ожидается, будет редкостью, но операция происходитдостаточно часто, чтобы быть потенциальным узким местом производительности.Преимущества спин-блокировки перед мьютексом:
- При разблокировке нет необходимости проверять, могут ли другие потоки ожидать блокировки и пробуждать их.Разблокировка - это просто одна атомарная инструкция записи.
- Неспособность немедленно получить блокировку не переводит ваш поток в спящий режим, поэтому он может получить блокировку с гораздо меньшей задержкой, как только она станет доступной.
- Нет риска загрязнения кэша при входе в пространство ядра для сна или пробуждения других потоков.
Точка 1 всегда будет стоять, но точки 2 и 3 имеют несколько меньшую полезность, если выучтите, что хорошие реализации мьютекса, вероятно, будут вращаться приличное количество раз, прежде чем обращаться к ядру за помощью в ожидании помощи.
Теперь длинный ответ:
Перед тем, как использовать спин-блокировки, нужно спросить себя:эти потенциальные преимущества перевешивают один редкий, но очень реальный недостаток: что происходит, когда поток, удерживающий блокировку, прерывается планировщиком, прежде чем он сможет снять блокировку.Это, конечно, редко, но это может случиться, даже если блокировка удерживается только для одной операции с переменным приращением или для чего-то еще столь же тривиального.В этом случае любые другие потоки, пытающиеся получить блокировку, будут продолжать вращаться, пока поток, удерживающий блокировку, не будет запланирован и не сможет снять блокировку. Это может никогда не произойти , если потоки, пытающиеся получить блокировку, имеют более высокие приоритеты, чем поток, который удерживает блокировку.Это может быть крайним случаем, но даже без разных приоритетов в игре могут быть очень длительные задержки, прежде чем владелец блокировки снова будет назначен, и, что хуже всего, как только эта ситуация начнется, он может быстро нарастить столько потоков, все надеютсяПолучите блокировку, начните вращаться на ней, затрачивая больше процессорного времени и еще больше откладывая планирование потока, который может снять блокировку.
Поэтому я буду осторожен с спин-блокировками ... :-)