Go 中原子分配指针
Go 提供了多种管理并发的工具,但经常出现的一个问题是是否分配指针是一个原子操作。
原子操作Go
在 Go 中,唯一保证原子性的操作是在sync.atomic 包中找到的操作。因此,分配指针本身并不是原子的。
安全指针分配
要原子地分配指针,您有两个选项:
示例Mutex
以下是使用sync.Mutex 来保护指针分配的示例:
import "sync" var secretPointer *int var pointerLock sync.Mutex func CurrentPointer() *int { pointerLock.Lock() defer pointerLock.Unlock() return secretPointer } func SetPointer(p *int) { pointerLock.Lock() secretPointer = p pointerLock.Unlock() }
原子原语示例
或者,你可以使用原子原语来实现原子性:
import "sync/atomic" import "unsafe" type Struct struct { p unsafe.Pointer // some pointer } func main() { data := 1 info := Struct{p: unsafe.Pointer(&data)} fmt.Printf("info is %d\n", *(*int)(info.p)) otherData := 2 atomic.StorePointer(&info.p, unsafe.Pointer(&otherData)) fmt.Printf("info is %d\n", *(*int)(info.p)) }
注意事项
以上是Go 中的指针赋值是原子的吗?如何保证它的安全?的详细内容。更多信息请关注PHP中文网其他相关文章!