Функция atomic.SwapUint64

Функция atomic.SwapUint64 атомарно устанавливает новое значение для переменной типа uint64 и возвращает ее предыдущее значение. Она принимает два параметра: указатель на переменную типа uint64 и новое значение типа uint64. Операция выполняется атомарно, что гарантирует безопасность при конкурентном доступе из нескольких горутин.

Синтаксис

goatomic.SwapUint64(addr *uint64, new uint64) (old uint64)

Пример

Давайте выполним атомарную замену значения переменной:

gopackage main

import (
  "fmt"
  "sync/atomic"
)

func main() {
  var val uint64 = 100
  old := atomic.SwapUint64(&val, 200)
  fmt.Println("Old value:", old)
  fmt.Println("New value:", val)
}

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

go"Old value: 100"
"New value: 200"

Пример

Давайте используем атомарную замену для реализации счетчика с одновременной заменой значения:

gopackage main

import (
  "fmt"
  "sync"
  "sync/atomic"
)

func main() {
  var counter uint64 = 0
  var wg sync.WaitGroup

  for i := 0; i < 10; i++ {
    wg.Add(1)
    go func() {
      defer wg.Done()
      old := atomic.SwapUint64(&counter, counter+1)
      fmt.Println("Old counter:", old)
    }()
  }

  wg.Wait()
  fmt.Println("Final counter:", counter)
}

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

go"Old counter: 0"
"Old counter: 1"
"Old counter: 2"
"Old counter: 3"
"Old counter: 4"
"Old counter: 5"
"Old counter: 6"
"Old counter: 7"
"Old counter: 8"
"Old counter: 9"
"Final counter: 10"

Пример

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

gopackage main

import (
  "fmt"
  "sync/atomic"
)

func main() {
  var val uint64 = 42
  old := atomic.SwapUint64(&val, 100)

  if old == 42 {
    fmt.Println("Old value was 42, replaced with 100")
  } else {
    fmt.Println("Unexpected old value:", old)
  }

  fmt.Println("Current value:", val)
}

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

go"Old value was 42, replaced with 100"
"Current value: 100"

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

  • функцию atomic.StoreUint64,
    которая атомарно сохраняет значение в переменную типа uint64
  • функцию atomic.LoadUint64,
    которая атомарно загружает значение типа uint64
  • функцию atomic.CompareAndSwapUint64,
    которая атомарно сравнивает и заменяет значение типа uint64
  • функцию atomic.AddUint64,
    которая атомарно прибавляет значение к переменной типа uint64