Більшість процесорів підтримують атомне читання або запис, і часто атомний cmp & swap. Це означає, що процесор сам пише або читає останнє значення за одну операцію, і може бути втрачено кілька циклів у порівнянні зі звичайним цілочисельним доступом, тим більше, що компілятор не може оптимізувати навколо атомних операцій майже так само добре, як звичайно.
З іншого боку, мьютекс - це ряд рядків коду для входу та виходу, і під час цього виконання інші процесори, які отримують доступ до того самого місця, повністю заблоковані, так що очевидно великі накладні витрати на них. У неоптимізованому високорівневому коді вхід / вихід mutex та атомар будуть викликами функцій, але для mutex будь-який конкуруючий процесор буде заблокований, поки ваша функція введення mutex повернеться, і поки ваша функція виходу буде запущена. Для атомного блокується лише тривалість фактичної операції. Оптимізація повинна зменшити цю вартість, але не всю.
Якщо ви намагаєтесь збільшити, тоді ваш сучасний процесор, ймовірно, підтримує атомне збільшення / зменшення, що буде чудово.
Якщо цього не відбувається, то він або реалізується за допомогою процесора atomic cmp & swap, або за допомогою mutex.
Мютекс:
get the lock
read
increment
write
release the lock
Atomic cmp & swap:
atomic read the value
calc the increment
do{
atomic cmpswap value, increment
recalc the increment
}while the cmp&swap did not see the expected value
Отже, ця друга версія має цикл [якщо інший процесор збільшує значення між нашими атомними операціями, тому значення більше не збігається, і приріст буде неправильним], який може затягнутися [якщо є багато конкурентів], але, як правило, все одно повинен бути швидшим, ніж версія mutex, але версія mutex може дозволити цьому процесору перемикатися на завдання.