Функция atomic.LoadInt32

Функция atomic.LoadInt32 используется для атомарного чтения 32-битного целого числа (тип int32) из памяти. В первый параметр мы передаем указатель на переменную типа int32, значение которой хотим атомарно прочитать. Функция возвращает текущее значение этой переменной. Это гарантирует, что операция чтения будет выполнена неделимо и результат не будет содержать промежуточных значений, возникающих при конкурентной записи.

Синтаксис

goatomic.LoadInt32(addr *int32) int32

Пример

Давайте рассмотрим базовый пример использования функции atomic.LoadInt32 для чтения значения переменной:

gopackage main

import (
  "fmt"
  "sync/atomic"
)

func main() {
  var value int32 = 100
  res := atomic.LoadInt32(&value)
  fmt.Println(res)
}

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

go100

Пример

Теперь рассмотрим пример, демонстрирующий атомарное чтение в конкурентной среде. В нескольких горутинах одновременно записывается и читается значение:

gopackage main

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

func main() {
  var value int32 = 0
  var wg sync.WaitGroup

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

  wg.Wait()
  res := atomic.LoadInt32(&value)
  fmt.Println(res)
}

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

go1000

Пример

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

gopackage main

import (
  "fmt"
  "sync/atomic"
)

func main() {
  var value int32 = 10
  oldValue := atomic.LoadInt32(&value)

  if atomic.CompareAndSwapInt32(&value, oldValue, 20) {
    fmt.Println("Update successful")
  }

  res := atomic.LoadInt32(&value)
  fmt.Println(res)
}

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

go"Update successful"
20

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

  • функцию atomic.StoreInt32,
    которая атомарно записывает значение в переменную
  • функцию atomic.AddInt32,
    которая атомарно прибавляет число к переменной
  • функцию atomic.CompareAndSwapInt32,
    которая атомарно сравнивает и обменивает значение
  • функцию atomic.SwapInt32,
    которая атомарно заменяет значение и возвращает старое