ох ... спинлоки это наипростейщие сущности для многопроцессорной работы если сомневайшся - сделай для себя свой спинлок его пример в википедии и пример для реализации на встроенном ассемблере - тож легко ищеться :)
спинлоки - единственно возможная нормальная чтука для очень кратковременных «запираний» и доступа к таким областям
мутексы на пару порядков более тормазные
спинлоки - единственно возможная нормальная чтука для очень кратковременных «запираний»
Для однопроцессорных/одноядерных систем спинлоки _вообще_ не имеют смысла. Для них годятся только ядерные мьютексы.
Спинлоки хороши, когда делается захват мьютекса, котороый с большей долей вероятности свободен. Поэтому, собственно, их часто и используют как основу для мьютексов (например, pthread_mutex_t в glibc на многопроцессорных/многоядерных системах сперва пытается захватить с помощью спинлока, и в случае неудачи обращается в ядро).
Если захвативший блокировку процесс уйдет с процессора, то плакала вся кратковременность.
sched_yield спасает. Тестировал в несколько потоков, которые много раз апдейтят защищённую переменную. Тривиальный спинлок тормозит из-за конфликтов, совпадающих с переключением процессов. С мутексом быстрее. А спинлок, который лочится с помощью trylock+sched_yield, ещё быстрее. Разница вполне ощутимая.