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