Функция atomic.LoadUint32

Функция atomic.LoadUint32 атомарно загружает значение 32-битного беззнакового целого (uint32) из переданного указателя. Она гарантирует, что чтение будет выполнено как единая неделимая операция, что особенно важно при работе с данными, разделяемыми между несколькими горутинами. В качестве единственного параметра функция принимает указатель на переменную типа uint32, а возвращает её текущее значение.

Синтаксис

goatomic.LoadUint32(addr *uint32) uint32

Пример

Давайте создадим переменную типа uint32 со значением 100 и атомарно прочитаем её с помощью atomic.LoadUint32:

gopackage main

import (
  "fmt"
  "sync/atomic"
)

func main() {
  var counter uint32 = 100
  res := atomic.LoadUint32(&counter)
  fmt.Println(res)
}

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

go100

Пример

Рассмотрим более практический пример, где несколько горутин атомарно инкрементируют счётчик, а мы читаем его финальное значение:

gopackage main

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

func main() {
  var counter uint32
  var wg sync.WaitGroup

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

  wg.Wait()
  res := atomic.LoadUint32(&counter)
  fmt.Println(res)
}

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

go1000

Пример

Если переменная не изменяется конкурентно, то можно использовать обычное чтение, но atomic.LoadUint32 всё равно обеспечивает гарантию видимости изменений между горутинами:

gopackage main

import (
  "fmt"
  "sync/atomic"
)

func main() {
  var value uint32 = 42
  go func() {
    atomic.StoreUint32(&value, 100)
  }()

  // Гарантируем видимость изменения
  res := atomic.LoadUint32(&value)
  fmt.Println(res)
}

Результат выполнения кода (может быть 42 или 100 в зависимости от времени выполнения горутины):

go42

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

  • функцию atomic.StoreUint32,
    которая атомарно записывает значение в переменную
  • функцию atomic.AddUint32,
    которая атомарно прибавляет значение к переменной
  • функцию atomic.SwapUint32,
    которая атомарно обменивает значение на новое и возвращает старое
  • функцию atomic.CompareAndSwapUint32,
    которая выполняет атомарное сравнение и обмен значениями