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

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

Golang 中的 atomic.StorePointer() 函数

在 Golang 中,如果需要实现线程安全的并发控制,可以使用 atomic 包中提供的函数。其中,atomic.StorePointer() 函数可以用于原子存储一个指针类型的值到指定的地址中。

函数原型

func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer)

其中,addr 表示指针变量的地址,val 表示要存储的指针类型的值。

调用示例

下面的示例演示了如何使用 atomic.StorePointer() 函数在多个 Goroutine 中实现线程安全的共享变量的更新。

package main

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

type Counter struct {
    count uint64
}

func main() {
    var counter unsafe.Pointer
    c := &Counter{}
    atomic.StorePointer(&counter, unsafe.Pointer(c))

    for i := 0; i < 5; i++ {
        go func() {
            for j := 0; j < 10000; j++ {
                c := (*Counter)(atomic.LoadPointer(&counter))
                c.count++
                atomic.StorePointer(&counter, unsafe.Pointer(c))
            }
        }()
    }

    for j := 0; j < 100000; j++ {
        c := (*Counter)(atomic.LoadPointer(&counter))
        fmt.Println(c.count)
    }
}

在上面的示例中,定义了一个 Counter 结构体,并且通过 atomic.StorePointer() 函数将其指针存储到了 counter 变量中。在循环启动的 5 个 Goroutine 中,使用 atomic.LoadPointer() 函数获取 counter 变量的指针,并且通过指针访问 count 字段,然后将其加 1,并且通过 atomic.StorePointer() 函数将 Counter 结构体的指针赋值给 counter 变量。最后,在主线程中循环访问 count 字段,输出其值。

总结

atomic.StorePointer() 函数可以用于实现线程安全的共享变量的更新,可以保证多个 Goroutine 能够安全地访问和修改共享变量。使用时需要注意参数类型,确保指针类型的参数与实际类型相符。