Функция atomic.LoadUint64
Функция atomic.LoadUint64 из пакета sync/atomic предназначена для атомарного чтения значения переменной типа uint64. Атомарные операции гарантируют, что чтение будет выполнено корректно даже при конкурентном доступе из нескольких горутин. В качестве единственного параметра функция принимает указатель на переменную типа uint64. Возвращает она текущее значение этой переменной.
Синтаксис
atomic.LoadUint64(addr)
Пример
Давайте создадим атомарную переменную типа uint64 с начальным значением '42' и прочитаем её с помощью atomic.LoadUint64:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var value uint64 = 42
res := atomic.LoadUint64(&value)
fmt.Println(res)
}
Результат выполнения кода:
42
Пример
Давайте покажем, что atomic.LoadUint64 может использоваться для безопасного чтения переменной, которая изменяется в других горутинах:
package 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)
}
Результат выполнения кода:
"Counter value: 2"
"Final counter: 5"
Пример
Давайте используем atomic.LoadUint64 в функции для проверки флага-индикатора, который управляет работой горутины:
package 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)
}
Результат выполнения кода:
"Working..."
"Working..."
"Working..."
"Stopped"
Смотрите также
-
функцию
atomic.StoreUint64,
которая атомарно записывает значение в переменную типа uint64 -
функцию
atomic.AddUint64,
которая атомарно прибавляет значение к переменной типа uint64 -
функцию
atomic.SwapUint64,
которая атомарно заменяет значение и возвращает старое -
функцию
atomic.CompareAndSwapUint64,
которая атомарно сравнивает и заменяет значение