Карточка Middle sync и атомики обновлено
CompareAndSwap
Вопрос
Что делает CompareAndSwap(old, new) и где его используют?
Попробуйте сами
Ответьте про себя или вслух, потом откройте ответ и сверьтесь.
Показать ответ и разбор
Коротко
Атомарно: если текущее значение равно old, записать new и вернуть true, иначе ничего не менять и вернуть false. Основа lock-free алгоритмов: цикл «прочитал, посчитал, попытался CAS, повторил при неудаче».
Ответ
Атомарно: если текущее значение равно old, записать new и вернуть true, иначе ничего не менять и вернуть false. Основа lock-free алгоритмов: цикл «прочитал, посчитал, попытался CAS, повторил при неудаче».
Разбор
Пример: атомарно обновить максимум for { cur := v.Load(); if x <= cur || v.CompareAndSwap(cur, x) { break } }.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «sync и атомики»
- Глобальный максимум через CompareAndSwap
- Конкурентные переводы между счетами без дедлока
- Шардированная мапа с мьютексом на шард
- Что выведет Go: atomic.Int64 из 100 горутин
- Что выведет Go: sync.Once и OnceValue
- Код-ревью Go: кеш на RWMutex
- Код-ревью Go: ленивый синглтон и горячая перезагрузка конфига
- Типизированные атомики