Функция atomic.LoadUint64

Функция atomic.LoadUint64 из пакета sync/atomic предназначена для атомарного чтения значения переменной типа uint64. Атомарные операции гарантируют, что чтение будет выполнено корректно даже при конкурентном доступе из нескольких горутин. В качестве единственного параметра функция принимает указатель на переменную типа uint64. Возвращает она текущее значение этой переменной.

Синтаксис

goatomic.LoadUint64(addr)

Пример

Давайте создадим атомарную переменную типа uint64 с начальным значением '42' и прочитаем её с помощью atomic.LoadUint64:

gopackage main

import (
  "fmt"
  "sync/atomic"
)

func main() {
  var value uint64 = 42
  res := atomic.LoadUint64(&value)
  fmt.Println(res)
}

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

go42

Пример

Давайте покажем, что atomic.LoadUint64 может использоваться для безопасного чтения переменной, которая изменяется в других горутинах:

gopackage main

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

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

  wg.Add(1)
  go func() {
    defer wg.Done()
    for i := 0; i < 5; i++ {
      atomic.AddUint64(&counter, 1)
      time.Sleep(10 * time.Millisecond)
    }
  }()

  time.Sleep(25 * time.Millisecond)
  res := atomic.LoadUint64(&counter)
  fmt.Println("Counter value:", res)

  wg.Wait()
  res = atomic.LoadUint64(&counter)
  fmt.Println("Final counter:", res)
}

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

go"Counter value: 2"
"Final counter: 5"

Пример

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

gopackage main

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

func main() {
  var running uint64 = 1

  go func() {
    for atomic.LoadUint64(&running) == 1 {
      fmt.Println("Working...")
      time.Sleep(100 * time.Millisecond)
    }
    fmt.Println("Stopped")
  }()

  time.Sleep(250 * time.Millisecond)
  atomic.StoreUint64(&running, 0)
  time.Sleep(50 * time.Millisecond)
}

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

go"Working..."
"Working..."
"Working..."
"Stopped"

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

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