РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
881 of 1593 menu

Функция atomic.StorePointer

Функция atomic.StorePointer выполняет атомарную запись значения указателя в указанную область памяти. Это гарантирует, что операция записи будет завершена полностью и другие горутины увидят новое значение указателя только после завершения записи. Первым параметром функция принимает указатель на unsafe.Pointer, в который нужно выполнить запись, вторым параметром - новое значение типа unsafe.Pointer, которое нужно сохранить.

Синтаксис

atomic.StorePointer(addr *unsafe.Pointer, val unsafe.Pointer)

Пример

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

package main import ( "fmt" "sync/atomic" "unsafe" ) func main() { var ptr unsafe.Pointer str := "hello" atomic.StorePointer(&ptr, unsafe.Pointer(&str)) res := (*string)(ptr) fmt.Println(*res) }

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

"hello"

Пример

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

package main import ( "fmt" "sync" "sync/atomic" "unsafe" ) type Config struct { Value string } func main() { var ptr unsafe.Pointer var wg sync.WaitGroup config := &Config{Value: "initial"} atomic.StorePointer(&ptr, unsafe.Pointer(config)) for i := 0; i < 3; i++ { wg.Add(1) go func() { defer wg.Done() p := atomic.LoadPointer(&ptr) cfg := (*Config)(p) fmt.Println(cfg.Value) }() } newConfig := &Config{Value: "updated"} atomic.StorePointer(&ptr, unsafe.Pointer(newConfig)) wg.Wait() }

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

"initial" "initial" "updated"

Пример

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

package main import ( "fmt" "sync/atomic" "unsafe" ) func main() { var ptr unsafe.Pointer initial := 100 atomic.StorePointer(&ptr, unsafe.Pointer(&initial)) for i := 0; i < 5; i++ { newVal := i * 10 atomic.StorePointer(&ptr, unsafe.Pointer(&newVal)) } res := (*int)(ptr) fmt.Println(*res) }

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

40

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

  • функцию atomic.LoadPointer,
    которая атомарно загружает значение указателя
  • функцию atomic.SwapPointer,
    которая атомарно обменивает значение указателя на новое и возвращает старое
  • функцию atomic.CompareAndSwapPointer,
    которая выполняет атомарное сравнение и замену значения указателя
  • тип atomic.Pointer,
    который предоставляет типизированный атомарный указатель
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить