Golang atomic.SwapPointer() 函数及示例

Golang atomic.SwapPointer() 函数及示例

Go 语言中,atomic 包提供了低级别的原子内存,有助于实现同步算法。Golang 中的 SwapPointer() 函数用于原子地将新值存储到 *addr 中,并返回之前的 *addr 值。此函数在 atomic 包中定义。在这里,您需要导入 “sync/atomic” 包才能使用这些函数。

语法:

func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer)

这里,addr 表示地址。new 是新的 unsafe.Pointer 值,old 是旧的 unsafe.Pointer 值。

注意:(*unsafe.Pointer) 是指向 unsafe.Pointer 值的指针。而 unsafe.Pointer 类型有助于使任意类型与内置的 uintptr 类型之间转换。此外,unsafe 是一个有助于 Go 程序类型安全的包。

返回值:它将新的 unsafe.Pointer 值存储到 *addr 中,并返回之前的 *addr 值。

示例 1:

// 展示 Go 中 SwapPointer 函数用法的程序

// 引入 main 包
package main

// 引入 fmt 和 sync/atomic
import (
    "fmt"
    "sync/atomic"
    "unsafe"
)

// 定义一个 L 结构体类型
type L struct{ x, y, z int }

//声明 L 结构体类型的指针
var PL *L

// 主函数
func main() {

    // 定义 *addr unsafe.Pointer
    var unsafepL = (*unsafe.Pointer)(unsafe.Pointer(&PL;))

    // 定义 unsafe.Pointer 的值
    var px, py L

    // 存储指针的值
    atomic.StorePointer(
        unsafepL, unsafe.Pointer(&px;))

    // 调用 SwapPointer() 方法
    px1 := atomic.SwapPointer(unsafepL,
                  unsafe.Pointer(&py;))

    // 如果交换成功返回 true
    fmt.Println((*L)(px1) == &px;)

    // 打印输出
    fmt.Println(px1)
} 

输出:

true
0xc0000c2000  // 可能会在不同的运行时有所不同

在这里,StorePointer 方法向 *addr 中添加值,然后 SwapPointer 方法原子地将新的值存储到 *addr 中并返回旧值。在这里,进行了交换,因此返回 true,这里返回的 unsafe.Pointer 值可能会在不同的运行时有所不同。

示例 2:

// 展示 Go 中 SwapPointer 函数用法的程序

// 引入 main 包
package main

// 引入 fmt 和 sync/atomic
import (
    "fmt"
    "sync/atomic"
    "unsafe"
)

// 定义一个 L 结构体类型
type L struct{ x, y, z int }

// 声明 L 结构体类型的指针
var PL *L

// 主函数
func main() {

    // 定义 *addr unsafe.Pointer
    var unsafepL = (*unsafe.Pointer)(unsafe.Pointer(&PL;))

    // 定义 unsafe.Pointer 值
    var px, py L

    // 调用 SwapPointer() 方法
    px1 := atomic.SwapPointer(unsafepL,
                  unsafe.Pointer(&py;))

    // 如果交换成功返回 true
    fmt.Println((*L)(px1) == &px;)

    // 打印输出
    fmt.Println(&px1;)
} 

输出:

false
0xc00000e028  // 可能会在不同的运行时有所不同

在这里,因为未存储 unsafe.pointer,因此 SwapPointer() 方法无法交换所述值,所以返回 false。此外,此处返回的地址值是 px1 的地址,而 px1 的值将为 nil,因为未执行交换操作。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程