Функция atomic.AddUintptr
Функция atomic.AddUintptr из пакета sync/atomic выполняет атомарное сложение значения типа uintptr.
Она принимает два параметра: указатель на переменную типа uintptr, значение которой нужно изменить,
и значение типа uintptr, которое нужно прибавить. Функция возвращает новое значение переменной.
Эта операция гарантирует, что чтение и запись будут выполнены как одна неделимая операция,
что критически важно при работе с указателями в многопоточном коде.
Синтаксис
atomic.AddUintptr(addr *uintptr, delta uintptr) uintptr
Пример
Давайте создадим переменную типа uintptr и выполним ее атомарное увеличение на 10:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var ptr uintptr = 100
newVal := atomic.AddUintptr(&ptr, 10)
fmt.Printf("ptr: %d, newVal: %d\n", ptr, newVal)
}
Результат выполнения кода:
"ptr: 110, newVal: 110"
Пример
Используем атомарное сложение с отрицательным значением для уменьшения переменной:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var ptr uintptr = 50
newVal := atomic.AddUintptr(&ptr, ^uintptr(10 - 1))
fmt.Printf("ptr: %d, newVal: %d\n", ptr, newVal)
}
Результат выполнения кода:
"ptr: 40, newVal: 40"
Пример
Продемонстрируем атомарное сложение в конкурентной среде с использованием горутин:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var ptr uintptr = 0
var wg sync.WaitGroup
for i := 0; i < 100; i++ {
wg.Add(1)
go func() {
defer wg.Done()
atomic.AddUintptr(&ptr, 1)
}()
}
wg.Wait()
fmt.Printf("ptr: %d\n", ptr)
}
Результат выполнения кода:
"ptr: 100"
Смотрите также
-
функцию
atomic.AddUint32,
которая выполняет атомарное сложение для типа uint32 -
функцию
atomic.AddUint64,
которая выполняет атомарное сложение для типа uint64 -
функцию
atomic.LoadUintptr,
которая атомарно загружает значение типа uintptr -
функцию
atomic.StoreUintptr,
которая атомарно сохраняет значение типа uintptr