Функция atomic.SwapUint64
Функция atomic.SwapUint64 атомарно устанавливает новое значение для переменной типа uint64 и возвращает ее предыдущее значение. Она принимает два параметра: указатель на переменную типа uint64 и новое значение типа uint64. Операция выполняется атомарно, что гарантирует безопасность при конкурентном доступе из нескольких горутин.
Синтаксис
atomic.SwapUint64(addr *uint64, new uint64) (old uint64)
Пример
Давайте выполним атомарную замену значения переменной:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var val uint64 = 100
old := atomic.SwapUint64(&val, 200)
fmt.Println("Old value:", old)
fmt.Println("New value:", val)
}
Результат выполнения кода:
"Old value: 100"
"New value: 200"
Пример
Давайте используем атомарную замену для реализации счетчика с одновременной заменой значения:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter uint64 = 0
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
old := atomic.SwapUint64(&counter, counter+1)
fmt.Println("Old counter:", old)
}()
}
wg.Wait()
fmt.Println("Final counter:", counter)
}
Результат выполнения кода:
"Old counter: 0"
"Old counter: 1"
"Old counter: 2"
"Old counter: 3"
"Old counter: 4"
"Old counter: 5"
"Old counter: 6"
"Old counter: 7"
"Old counter: 8"
"Old counter: 9"
"Final counter: 10"
Пример
Давайте выполним атомарную замену с проверкой старого значения:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var val uint64 = 42
old := atomic.SwapUint64(&val, 100)
if old == 42 {
fmt.Println("Old value was 42, replaced with 100")
} else {
fmt.Println("Unexpected old value:", old)
}
fmt.Println("Current value:", val)
}
Результат выполнения кода:
"Old value was 42, replaced with 100"
"Current value: 100"
Смотрите также
-
функцию
atomic.StoreUint64,
которая атомарно сохраняет значение в переменную типа uint64 -
функцию
atomic.LoadUint64,
которая атомарно загружает значение типа uint64 -
функцию
atomic.CompareAndSwapUint64,
которая атомарно сравнивает и заменяет значение типа uint64 -
функцию
atomic.AddUint64,
которая атомарно прибавляет значение к переменной типа uint64