Функция atomic.CompareAndSwapInt64

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

Синтаксис

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

Пример

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

gopackage 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)
}

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

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

Пример

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

gopackage 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)
}

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

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

Пример

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

gopackage 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)
}

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

go"Final counter value: 10"

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

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