РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
888 of 1593 menu

Функция atomic.CompareAndSwapInt64

Функция atomic.CompareAndSwapInt64 выполняет атомарную операцию сравнения и замены (CAS) для 64-битного целого числа. Она принимает три параметра: указатель на переменную типа int64, ожидаемое значение и новое значение. Если текущее значение по указателю равно ожидаемому, то функция заменяет его на новое и возвращает true. В противном случае значение не изменяется и функция возвращает false. Эта операция выполняется атомарно, что гарантирует корректную работу в конкурентной среде без использования блокировок.

Синтаксис

atomic.CompareAndSwapInt64(addr *int64, old, new int64) bool

Пример

Давайте выполним атомарную замену значения, когда текущее значение равно ожидаемому:

package main import ( "fmt" "sync/atomic" ) func main() { var value int64 = 10 old := int64(10) new := int64(20) res := atomic.CompareAndSwapInt64(&value, old, new) fmt.Println("Operation result:", res) fmt.Println("Current value:", value) }

Результат выполнения кода:

"Operation result: true" "Current value: 20"

Пример

А теперь выполним замену, когда текущее значение не соответствует ожидаемому:

package main import ( "fmt" "sync/atomic" ) func main() { var value int64 = 15 old := int64(10) new := int64(25) res := atomic.CompareAndSwapInt64(&value, old, new) fmt.Println("Operation result:", res) fmt.Println("Current value:", value) }

Результат выполнения кода:

"Operation result: false" "Current value: 15"

Пример

Использование atomic.CompareAndSwapInt64 в цикле для атомарного обновления значения с проверкой условия:

package main import ( "fmt" "sync" "sync/atomic" ) func main() { var counter int64 = 0 var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { defer wg.Done() for { old := atomic.LoadInt64(&counter) new := old + 1 if atomic.CompareAndSwapInt64(&counter, old, new) { break } } }() } wg.Wait() fmt.Println("Final counter value:", counter) }

Результат выполнения кода:

"Final counter value: 10"

Смотрите также

  • функцию atomic.CompareAndSwapInt32,
    которая выполняет атомарное сравнение и замену 32-битного целого числа
  • функцию atomic.LoadInt64,
    которая атомарно считывает значение 64-битного целого числа
  • функцию atomic.StoreInt64,
    которая атомарно записывает значение в 64-битное целое число
  • структуру atomic.Int64,
    которая предоставляет удобный интерфейс для работы с атомарным 64-битным целым числом
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить