Golang atomic.LoadPointer() 函数及示例

Golang atomic.LoadPointer() 函数及示例

Go 语言中, atomic 包提供了较低级别的原子内存,有助于实现同步算法。Go 语言中的 LoadPointer() 函数用于原子加载 *addr 。此函数在 atomic 包中定义。您需要导入 “sync/atomic” 和 “unsafe” 包以使用这些函数。

语法:

func LoadPointer(addr *unsafe.Pointer) (val unsafe.Pointer)

在此处,addr 表示地址。

注意: (*unsafe.Pointer)是指向 _unsafe.Pointer_ 值的指针。 _unsafe.Pointer_ 类型有助于在任意类型和内置 _uintptr_ 类型之间进行过渡。此外,unsafe 是有助于 Go 程序的类型安全的包。

返回值: 它自动加载 *addr 并返回 _unsafe.Pointer_ 。

示例1:

// Go 中 LoadPointer 函数的使用示例
 
// 引入 main 包
package main
 
// 引入 fmt、sync/atomic 和 unsafe 包
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 L
 
    // 调用 StorePointer 并存储 unsafe.Pointer 的值至 *addr
    atomic.StorePointer(
        unsafepL, unsafe.Pointer(&px))
 
    // 调用 LoadPointer() 方法
    px1 := (*L)(atomic.LoadPointer(unsafepL))
 
    // 如果已加载 *addr,则返回 true,否则返回 false
    fmt.Println(px1 == &px)
 
    // 打印 unsafe.Pointer
    fmt.Println(&px1)
} 

输出:

true
0xc0000b8018 // 在每次运行时会不同

在此处, StorePointer 方法向 *addr 添加值,然后 LoadPointer 方法以原子方式加载 *addr 。因此,在此处完成了加载,因此返回 true,后面返回 unsafe.Pointer 的值可以在不同的运行时有所不同。
示例2:

// Go 中 LoadPointer 函数的使用示例
 
// 引入 main 包
package main
 
// 引入 fmt、sync/atomic 和 unsafe 包
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 L
 
    // 调用 LoadPointer() 方法
    px1 := (*L)(atomic.LoadPointer(unsafepL))
 
    // 如果已加载 *addr,则返回 true,否则返回 false
    fmt.Println(px1 == &px)
 
    // 打印 unsafe.Pointer
    fmt.Println(&px1)
} 

输出:

false
0xc00000e028  // 每次运行返回一个随机值

在此处,因为未存储 unsafe.pointer,所以 LoadPointer() 方法无法加载 *addr ,因此返回 false。此外,此处返回的地址值是 px1 的地址。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程