Как работает atomic.CompareAndSwap?

Middle
190 просмотров
AFK Offer AI

atomic.CompareAndSwapInt64(addr, old, new) — если *addr == old, записывает new и возвращает true. Иначе — false, значение не меняется. Всё атомарно, без mutex. Пример — lock-free counter: for { old := atomic.LoadInt64(&counter); if atomic.CompareAndSwapInt64(&counter, old, old+1) { break } }. Но для простого инкремента лучше atomic.AddInt64. CAS нужен для сложных операций: атомарная замена указателя, lock-free структуры данных. В Go 1.19+ есть generic atomic.Pointer[T].

Следующий вопрос

Что такое breaking change в protobuf?