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

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

Golang 中的 atomic.SwapPointer() 函数示例

Golang 中的 atomic 包提供了一组原子操作函数,用于同步并发访问共享变量。其中之一是 atomic.SwapPointer() 函数,用于原子地交换指针的值。

函数签名
func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer)
  • addr:要交换值的指针的地址
  • new:新的指针值
  • old:返回旧的指针值,即交换之前的值
示例

下面的示例展示了如何使用 atomic.SwapPointer() 函数来原子地交换指针的值:

package main

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

func main() {
	var data unsafe.Pointer // 注意:需要使用 unsafe.Pointer 类型

	// 设置初始指针值
	atomic.StorePointer(&data, unsafe.Pointer(nil))

	// 创建一个新的指针值
	newPtr := unsafe.Pointer(new(int))

	// 原子地交换指针的值
	oldPtr := atomic.SwapPointer(&data, newPtr)

	// 输出交换前的旧指针值和交换后的新指针值
	fmt.Println("old pointer:", oldPtr)
	fmt.Println("new pointer:", atomic.LoadPointer(&data))
}

输出结果如下:

old pointer: <nil>
new pointer: 0xc0000ac080

该示例中,我们首先声明了一个 unsafe.Pointer 类型的变量 data,它将被用于存储指针值。

然后,我们使用 atomic.StorePointer() 函数将 data 的初始值设置为 nil,即空指针。

接下来,我们创建了一个新的指针值 newPtr,使用 unsafe.Pointer 封装将其转换为 unsafe.Pointer 类型。

最后,我们使用 atomic.SwapPointer() 函数原子地交换 data 指针的值。通过调用 atomic.LoadPointer() 函数,我们可以获得交换后的新指针值。

结论

atomic.SwapPointer() 函数在多个 Goroutine 并发访问共享变量时是非常有用的。它确保了原子级别的指针值交换操作,提供了更可靠的数据同步机制。它适用于任何需要原子地交换指针的场景,如线程安全的对象池、资源管理等。