📅  最后修改于: 2023-12-03 15:15:22.351000             🧑  作者: Mango
在 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 能够安全地访问和修改共享变量。使用时需要注意参数类型,确保指针类型的参数与实际类型相符。