Go 中指针的原子分配
Golang 中是否可以原子分配指针?具体来说,如果你想将一个指针设置为nil,并保证其他线程可以立即观察到这个变化,是否需要使用锁?
在Java中,可以使用 volatile 关键字来实现原子指针赋值,但 Go 中不存在这样的机制。
答案:
Go 中唯一保证的原子操作是这些由sync.atomic包提供。分配常规指针本质上并不是原子性的。
为了确保原子性,一种选择是使用锁,例如sync.Mutex。或者,您可以考虑使用sync.atomic原语之一。然而,后者需要仔细处理,并且可能难以正确实现。
例如,考虑以下惯用的 Go 代码:
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() }
这些函数在维护线程的同时提供对指针的访问通过使用互斥体来保证安全。
或者,如果可能的话,限制对单个 goroutine 的指针访问并使用通道来访问可能更惯用。传达更改。
使用atomic.StorePointer
作为使用锁的替代方案,sync/atomic 包提供了用于原子指针分配的 StorePointer 函数。然而,这种方法需要使用 unsafe.Pointer,并且由于其潜在的错误和未定义行为而不被认为是良好实践。
以上是Go 中可以进行原子指针分配吗?如何安全地实现它?的详细内容。更多信息请关注PHP中文网其他相关文章!