📌  相关文章
📜  Golang 中的 atomic.CompareAndSwapPointer()函数示例(1)

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

Golang 中的 atomic.CompareAndSwapPointer()函数

atomic.CompareAndSwapPointer() 函数是 Go 语言标准库中的原子操作函数之一,主要用于比较并交换指针值。

函数签名
func CompareAndSwapPointer(addr *unsafe.Pointer, old, new unsafe.Pointer) (swapped bool)

其中:

  • addr:需要比较和交换的指针地址;
  • old:期望匹配的旧值;
  • new:需要替换的新值;
  • swapped:返回是否交换成功,类型为 bool
函数实现

atomic.CompareAndSwapPointer() 函数的实现方式是利用 CPU 提供的原子操作指令。在比较和交换时,函数会借助 CPU 的原子操作指令,将 addr 指向的值与 old 指向的值进行比较,如果相同,则将 addr 指向的值替换为 new 指向的值,并返回交换成功的标记。

示例代码
package main

import (
    "fmt"
    "sync/atomic"
    "unsafe"
)

func main() {
    var ptr unsafe.Pointer
    oldPtr := unsafe.Pointer(nil)
    newPtr := unsafe.Pointer(new(int))

    fmt.Printf("Old pointer value: %v\n", oldPtr)
    swapped := atomic.CompareAndSwapPointer(&ptr, oldPtr, newPtr)
    fmt.Printf("Swapped: %v\n", swapped)
    fmt.Printf("New pointer value: %v\n", ptr)
}

上述示例代码中,我们首先定义了一个 unsafe.Pointer 类型的指针变量 ptr,并将其初始值设为 nil。然后,我们定义了需要匹配的旧值 oldPtr,以及需要替换的新值 newPtr,其类型均为 unsafe.Pointer

在调用 atomic.CompareAndSwapPointer() 函数时,我们将 ptr 的地址作为 addr 参数传入,将 oldPtrnewPtr 分别作为 oldnew 参数传入。函数返回的布尔值 swapped 用于标示是否交换成功。最后,我们分别输出了交换前和交换后的 ptr 指针变量值。

运行上述示例代码,我们可以看到如下输出:

Old pointer value: <nil>
Swapped: true
New pointer value: 0x40a1a0

交换成功的标记为 true,并且 ptr 的值已经被替换为了 newPtr 的指向地址,即 0x40a1a0