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

Функция atomic.SwapInt64

Функция atomic.SwapInt64 атомарно заменяет значение переменной типа int64 на новое значение и возвращает старое значение, которое было до замены. В первый параметр функция принимает указатель на переменную типа int64, во второй параметр - новое значение типа int64, которое нужно установить.

Операция выполняется атомарно, что гарантирует ее безопасность при конкурентном доступе из нескольких горутин. Это особенно важно при работе с общими данными в многопоточных программах, где обычные операции присваивания могут привести к состояниям гонки.

Синтаксис

atomic.SwapInt64(addr *int64, new int64) int64

Пример с одной горутиной

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

package main import ( "fmt" "sync/atomic" ) func main() { var val int64 = 10 old := atomic.SwapInt64(&val, 20) fmt.Printf("Old value: %d, New value: %d\n", old, val) }

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

"Old value: 10, New value: 20"

Пример с несколькими горутинами

Теперь рассмотрим пример, демонстрирующий безопасную замену значения из нескольких горутин:

package main import ( "fmt" "sync" "sync/atomic" ) func main() { var counter int64 = 0 var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go func(id int) { defer wg.Done() old := atomic.SwapInt64(&counter, int64(id)) fmt.Printf("Goroutine %d: old=%d, new=%d\n", id, old, counter) }(i) } wg.Wait() fmt.Printf("Final counter: %d\n", atomic.LoadInt64(&counter)) }

Результат выполнения кода (порядок может меняться):

"Goroutine 2: old=0, new=2" "Goroutine 3: old=2, new=3" "Goroutine 4: old=3, new=4" "Goroutine 0: old=4, new=0" "Goroutine 1: old=0, new=1" "Final counter: 1"

Пример с использованием в цикле

Давайте рассмотрим, как можно использовать atomic.SwapInt64 для поочередной замены значений в цикле:

package main import ( "fmt" "sync/atomic" ) func main() { var value int64 = 100 for i := 0; i < 3; i++ { old := atomic.SwapInt64(&value, int64(i*10)) fmt.Printf("Iteration %d: old=%d, new=%d\n", i, old, value) } fmt.Printf("Final value: %d\n", atomic.LoadInt64(&value)) }

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

"Iteration 0: old=100, new=0" "Iteration 1: old=0, new=10" "Iteration 2: old=10, new=20" "Final value: 20"

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

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