📜  Golang 中的原子变量(1)

📅  最后修改于: 2023-12-03 15:31:01.872000             🧑  作者: Mango

Golang 中的原子变量

在并发编程中,原子操作是指一系列操作,它们执行起来就像是一个单一、不可分割的操作。在 Golang 中,原子操作可以使用 sync/atomic 包来实现,该包提供了一些函数来支持原子操作,例如 AddInt32CompareAndSwapInt64LoadPointerStoreUint32 等函数。

原子变量类型

在 Golang 中,原子变量类型使用 sync/atomic 包提供的类型。常用的原子变量类型包括以下几种:

  1. int32int64uint32uint64:对应原子类型的整数类型;
  2. uintptr:对应原子类型的指针类型;
  3. unsafe.Pointer:对应原子类型的任意指针类型。
原子操作函数

sync/atomic 包提供了一系列原子操作函数,常见的函数包括以下几种:

  1. AddInt32AddInt64AddUint32AddUint64:原子地将原子变量的值加上指定的增量,并返回原子变量更新后的值;
  2. CompareAndSwapInt32CompareAndSwapInt64CompareAndSwapUint32CompareAndSwapUint64:原子地比较原子变量当前的值和旧值,如果相等则将原子变量的值设置为新值,返回一个布尔值表示操作是否成功;
  3. LoadInt32LoadInt64LoadUint32LoadUint64:原子地读取原子变量的值,并返回该值;
  4. StoreInt32StoreInt64StoreUint32StoreUint64:原子地将原子变量设置为指定的值;
  5. SwapInt32SwapInt64SwapUint32SwapUint64:原子地将原子变量的值设置为给定的新值,并返回原来的值。
示例

下面是一段示例代码:

package main

import (
    "fmt"
    "sync/atomic"
)

func main() {
    var n int32 = 0
    atomic.AddInt32(&n, 1)
    fmt.Println(n)

    old := atomic.CompareAndSwapInt32(&n, 1, 2)
    fmt.Println(n, old)

    old = atomic.SwapInt32(&n, 3)
    fmt.Println(n, old)
}

在上面的代码中,我们定义了一个 int32 类型的原子变量 n,然后使用 atomic.AddInt32 函数将其值加 1,并输出其值。接下来,我们使用 atomic.CompareAndSwapInt32 函数比较 n 的当前值和 1 是否相等,如果相等则将 n 的值设置为 2,并将操作是否成功的结果保存在 old 中。最后,我们使用 atomic.SwapInt32 函数将 n 的值设置为 3,并输出其值以及原来的值。