Функция atomic.LoadInt64
Функция atomic.LoadInt64 выполняет атомарное чтение значения типа int64.
В качестве единственного параметра она принимает указатель на переменную типа int64,
а возвращает текущее значение этой переменной. Эта функция гарантирует,
что операция чтения будет выполнена как единое целое, без возможности
прерывания и возникновения гонок данных между горутинами.
Синтаксис
atomic.LoadInt64(addr *int64) int64
Пример
Давайте рассмотрим простой пример использования функции atomic.LoadInt64
для чтения значения переменной:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var counter int64 = 100
val := atomic.LoadInt64(&counter)
fmt.Println(val)
}
Результат выполнения кода:
100
Пример
Теперь рассмотрим пример с конкурентным доступом к переменной. Две горутины атомарно изменяют и считывают значение:
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
func main() {
var counter int64 = 0
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
for i := 0; i < 5; i++ {
atomic.AddInt64(&counter, 10)
time.Sleep(10 * time.Millisecond)
}
}()
wg.Add(1)
go func() {
defer wg.Done()
for i := 0; i < 5; i++ {
val := atomic.LoadInt64(&counter)
fmt.Printf("Current value: %d\n", val)
time.Sleep(10 * time.Millisecond)
}
}()
wg.Wait()
}
Результат выполнения кода:
"Current value: 10"
"Current value: 20"
"Current value: 30"
"Current value: 40"
"Current value: 50"
Пример
В этом примере показано, как atomic.LoadInt64 используется для безопасного
чтения значения, которое может быть изменено в любой момент
другой горутиной:
package main
import (
"fmt"
"sync/atomic"
"time"
)
func main() {
var value int64 = 42
go func() {
for i := 0; i < 3; i++ {
atomic.AddInt64(&value, 5)
time.Sleep(50 * time.Millisecond)
}
}()
for i := 0; i < 3; i++ {
current := atomic.LoadInt64(&value)
fmt.Printf("Read: %d\n", current)
time.Sleep(100 * time.Millisecond)
}
}
Результат выполнения кода:
"Read: 42"
"Read: 47"
"Read: 52"
Смотрите также
-
функцию
atomic.StoreInt64,
которая атомарно устанавливает новое значение для 64-битного целого числа -
функцию
atomic.AddInt64,
которая атомарно прибавляет значение к 64-битному целому числу -
функцию
atomic.SwapInt64,
которая атомарно заменяет значение и возвращает старое -
функцию
atomic.CompareAndSwapInt64,
которая атомарно сравнивает и заменяет значение