Функция atomic.AddUintptr

Функция atomic.AddUintptr из пакета sync/atomic выполняет атомарное сложение значения типа uintptr. Она принимает два параметра: указатель на переменную типа uintptr, значение которой нужно изменить, и значение типа uintptr, которое нужно прибавить. Функция возвращает новое значение переменной. Эта операция гарантирует, что чтение и запись будут выполнены как одна неделимая операция, что критически важно при работе с указателями в многопоточном коде.

Синтаксис

goatomic.AddUintptr(addr *uintptr, delta uintptr) uintptr

Пример

Давайте создадим переменную типа uintptr и выполним ее атомарное увеличение на 10:

gopackage 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)
}

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

go"ptr: 110, newVal: 110"

Пример

Используем атомарное сложение с отрицательным значением для уменьшения переменной:

gopackage 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)
}

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

go"ptr: 40, newVal: 40"

Пример

Продемонстрируем атомарное сложение в конкурентной среде с использованием горутин:

gopackage 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)
}

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

go"ptr: 100"

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

  • функцию atomic.AddUint32,
    которая выполняет атомарное сложение для типа uint32
  • функцию atomic.AddUint64,
    которая выполняет атомарное сложение для типа uint64
  • функцию atomic.LoadUintptr,
    которая атомарно загружает значение типа uintptr
  • функцию atomic.StoreUintptr,
    которая атомарно сохраняет значение типа uintptr