Функция atomic.StoreUint64
Функция atomic.StoreUint64 атомарно записывает
новое значение в переменную типа uint64.
В первый параметр функция принимает указатель на переменную,
в которую нужно записать значение, во второй параметр -
значение, которое нужно записать. Атомарная запись гарантирует,
что операция записи будет выполнена как единое целое,
что особенно важно при работе с конкурентным кодом.
Синтаксис
atomic.StoreUint64(addr *uint64, val uint64)
Пример
Давайте запишем значение 100 в переменную
с помощью атомарной операции:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var value uint64 = 42
atomic.StoreUint64(&value, 100)
fmt.Println(value)
}
Результат выполнения кода:
100
Пример
Давайте посмотрим, как атомарная запись работает в конкурентной среде с несколькими горутинами:
package 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)
}
Результат выполнения кода:
100
Пример
Давайте используем атомарную запись вместе с атомарной загрузкой для безопасного обмена данными между горутинами:
package 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()
}
Результат выполнения кода:
"loaded: 0"
Смотрите также
-
функцию
atomic.LoadUint64,
которая атомарно загружает значение из переменной типа uint64 -
функцию
atomic.StoreInt64,
которая атомарно записывает значение в переменную типа int64 -
функцию
atomic.SwapUint64,
которая атомарно обменивает значение и возвращает старое -
функцию
atomic.CompareAndSwapUint64,
которая атомарно сравнивает и заменяет значение