Функция atomic.AddUint64

Функция atomic.AddUint64 из пакета sync/atomic выполняет атомарное прибавление указанного значения к переменной типа uint64 и возвращает новое значение. Первым параметром функция принимает указатель на переменную типа uint64, вторым параметром - значение типа uint64, которое нужно прибавить.

Эта функция гарантирует, что операция сложения будет выполнена атомарно без использования блокировок. Она особенно полезна при работе с счетчиками и накопителями в конкурентных программах.

Синтаксис

goatomic.AddUint64(addr *uint64, delta uint64) uint64

Пример

Давайте создадим переменную типа uint64 и атомарно прибавим к ней значение 42:

gopackage main

import (
  "fmt"
  "sync/atomic"
)

func main() {
  var counter uint64 = 10
  newVal := atomic.AddUint64(&counter, 42)
  fmt.Println(newVal)
}

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

go52

Пример

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

gopackage main

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

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

  for i := 0; i < 1000; i++ {
    wg.Add(1)
    go func() {
      defer wg.Done()
      atomic.AddUint64(&counter, 1)
    }()
  }

  wg.Wait()
  fmt.Println(counter)
}

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

go1000

Пример

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

gopackage main

import (
  "fmt"
  "sync/atomic"
)

func main() {
  var counter uint64 = 5
  newVal := atomic.AddUint64(&counter, 10)

  if newVal > 10 {
    fmt.Println("new value is greater than 10")
  }

  fmt.Println(newVal)
}

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

go"new value is greater than 10"
15

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

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