Функция atomic.CompareAndSwapInt64
Функция atomic.CompareAndSwapInt64 выполняет атомарную операцию сравнения и замены (CAS) для 64-битного целого числа. Она принимает три параметра: указатель на переменную типа int64, ожидаемое значение и новое значение. Если текущее значение по указателю равно ожидаемому, то функция заменяет его на новое и возвращает true. В противном случае значение не изменяется и функция возвращает false. Эта операция выполняется атомарно, что гарантирует корректную работу в конкурентной среде без использования блокировок.
Синтаксис
atomic.CompareAndSwapInt64(addr *int64, old, new int64) bool
Пример
Давайте выполним атомарную замену значения, когда текущее значение равно ожидаемому:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var value int64 = 10
old := int64(10)
new := int64(20)
res := atomic.CompareAndSwapInt64(&value, old, new)
fmt.Println("Operation result:", res)
fmt.Println("Current value:", value)
}
Результат выполнения кода:
"Operation result: true"
"Current value: 20"
Пример
А теперь выполним замену, когда текущее значение не соответствует ожидаемому:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var value int64 = 15
old := int64(10)
new := int64(25)
res := atomic.CompareAndSwapInt64(&value, old, new)
fmt.Println("Operation result:", res)
fmt.Println("Current value:", value)
}
Результат выполнения кода:
"Operation result: false"
"Current value: 15"
Пример
Использование atomic.CompareAndSwapInt64 в цикле для атомарного обновления значения с проверкой условия:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter int64 = 0
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for {
old := atomic.LoadInt64(&counter)
new := old + 1
if atomic.CompareAndSwapInt64(&counter, old, new) {
break
}
}
}()
}
wg.Wait()
fmt.Println("Final counter value:", counter)
}
Результат выполнения кода:
"Final counter value: 10"
Смотрите также
-
функцию
atomic.CompareAndSwapInt32,
которая выполняет атомарное сравнение и замену 32-битного целого числа -
функцию
atomic.LoadInt64,
которая атомарно считывает значение 64-битного целого числа -
функцию
atomic.StoreInt64,
которая атомарно записывает значение в 64-битное целое число -
структуру
atomic.Int64,
которая предоставляет удобный интерфейс для работы с атомарным 64-битным целым числом