Независимо от того, какой метод вы используете, наихудшая проблема производительности вашего кода не имеет ничего общего с тем, какой тип блокировки вы используете, а с тем фактом, что вы блокируете код, а не данные.
С учетом вышесказанного, нет никаких оснований для того, чтобы закатывать такие собственные спин-блокировки. Либо используйте pthread_spin_lock
, если вы хотите спин-блокировку, либо pthread_mutex_lock
или sem_wait
(с двоичным семафором), если вы хотите блокировку, которая может уступать другим процессам, когда они утверждаются. Код, который вы написали, является худшим из обоих миров по тому, как он использует sched_yield
. Вызов sched_yield
гарантирует, что блокировка будет ждать не менее нескольких миллисекунд (и, вероятно, весь временной интервал планирования) в случае, когда есть конфликт блокировки и нагрузка на процессор, и она будет сжигать 100% ЦП, когда есть конфликт, но нет ЦП. нагрузка (например, из-за блокировки замка в IO). Если вы хотите получить какое-либо из преимуществ спин-блокировки, вам нужно вращаться без каких-либо системных вызовов. Если вы хотите получить какое-либо преимущество от использования процессора, вы должны использовать правильный примитив синхронизации, который будет использовать (в Linux) futex
(или эквивалентные) операции для получения точно до тех пор, пока блокировка не станет доступной - не короче и не больше.
И если случайно все, что произошло у тебя над головой, даже не думай писать свои собственные замки ..