Golang atomic.CompareAndSwapPointer() 函数的应用及示例
在 Go 语言中,atomic 包提供了较低级别的原子内存,有助于实现同步算法。Go 语言中的 CompareAndSwapPointer() 函数用于执行比较和交换操作,用于 unsafe.Pointer 值,该函数在 atomic 包中定义。在此,您需要导入 “sync / atomic” 包才能使用这些函数。
语法:
func CompareAndSwapPointer(addr *unsafe.Pointer, old, new unsafe.Pointer) (swapped bool)
这里,addr 表示地址,old 表示不安全的指针值,是从 SwapPointer 操作返回的旧交换值,new 是不安全的指针新值,将从旧交换值中交换自己。
注意:(*unsafe.Pointer) 是不安全的指针值的指针。而 unsafe.Pointer 类型有助于在任意类型和内置 uintptr 类型之间启用转换。此外,unsafe 是可帮助 Go 程序的类型安全的包。
返回值:如果完成交换,则返回 true,否则返回 false。
示例 1:
// Golang 中 CompareAndSwapPointer 函数的用法示例
// 包含主要程序
package main
// 导入 fmt、sync/atomic 和 unsafe 包
import (
"fmt"
"sync/atomic"
"unsafe"
)
// 定义结构体 P
type P struct{ x,y,z int }
// 声明指向 P 结构体类型的指针
var pP *P
// 主函数
func main() {
// 定义 addr 不安全指针
var unsafe1 = (*unsafe.Pointer)(unsafe.Pointer(&pP))
// 旧的不安全指针
var sy P
// 定义新的不安全指针
px := atomic.SwapPointer(
unsafe1, unsafe.Pointer(&sy))
// 调用带有其参数的 CompareAndSwapPointer 方法
y := atomic.CompareAndSwapPointer(
unsafe1, unsafe.Pointer(&sy), px)
// 如果交换成功,则返回 true,否则返回 false
fmt.Println(y)
}
输出:
true
示例 2:
// Golang 中 CompareAndSwapPointer 函数的用法示例
// 包含主要程序
package main
// 导入 fmt、sync/atomic 和 unsafe 包
import (
"fmt"
"sync/atomic"
"unsafe"
)
// 定义结构体 P
type P struct{ x,y,z int }
// 声明指向 P 结构体类型的指针
var pP *P
// 主函数
func main() {
// 定义 addr 不安全指针
var unsafe1 = (*unsafe.Pointer)(unsafe.Pointer(&pP))
// 旧的不安全指针
var sy P
// 定义新的不安全指针
px := atomic.SwapPointer(
unsafe1, unsafe.Pointer(&sy))
// 调用带有其参数的 CompareAndSwapPointer 方法
y := atomic.CompareAndSwapPointer(
unsafe1, px, unsafe.Pointer(&sy))
// 如果交换成功,则返回 true,否则返回 false
fmt.Println(y)
}
输出:
false
在上面的示例中,未执行交换,因为 CompareAndSwapPointer() 方法中的旧值必须是从 SwapPointer() 方法返回的值,但是此处的旧值与这里的值不同,因此从上面的代码返回 false。