Функция atomic.StoreUint64

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

Синтаксис

goatomic.StoreUint64(addr *uint64, val uint64)

Пример

Давайте запишем значение 100 в переменную с помощью атомарной операции:

gopackage main

import (
  "fmt"
  "sync/atomic"
)

func main() {
  var value uint64 = 42
  atomic.StoreUint64(&value, 100)

  fmt.Println(value)
}

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

go100

Пример

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

gopackage main

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

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

  for i := 0; i < 5; i++ {
    wg.Add(1)
    go func() {
      defer wg.Done()
      atomic.StoreUint64(&value, 100)
      time.Sleep(time.Millisecond)
    }()
  }

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

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

go100

Пример

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

gopackage main

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

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

  wg.Add(1)
  go func() {
    defer wg.Done()
    time.Sleep(100 * time.Millisecond)
    atomic.StoreUint64(&value, 999)
  }()

  wg.Add(1)
  go func() {
    defer wg.Done()
    time.Sleep(50 * time.Millisecond)
    loaded := atomic.LoadUint64(&value)
    fmt.Printf("loaded: %d\n", loaded)
  }()

  wg.Wait()
}

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

go"loaded: 0"

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

  • функцию atomic.LoadUint64,
    которая атомарно загружает значение из переменной типа uint64
  • функцию atomic.StoreInt64,
    которая атомарно записывает значение в переменную типа int64
  • функцию atomic.SwapUint64,
    которая атомарно обменивает значение и возвращает старое
  • функцию atomic.CompareAndSwapUint64,
    которая атомарно сравнивает и заменяет значение