Go 中指针赋值的原子性
Go 中指针赋值是原子的吗?换句话说,多个线程可以同时操作一个指针而不导致未定义的行为吗?
答案:
Go 中的原子操作仅限于那些在sync中显式定义的操作。原子包。因此,分配常规指针不能保证是原子的。
为了确保跨线程的行为一致,您有两个选择:
1。使用锁同步:
使用sync.Mutex等同步原语来保护对指针的访问。例如:
var p *int var lock sync.Mutex func GetPointer() *int { lock.Lock() defer lock.Unlock() return p } func SetPointer(value *int) { lock.Lock() p = value lock.Unlock() }
2。原子基元(建议谨慎):
或者,您可以使用sync.atomic 执行原子指针分配。然而,这种方法需要仔细处理不安全的指针转换:
import ( "sync/atomic" "unsafe" ) var p = unsafe.Pointer(nil) func SetPointer(value *int) { atomic.StorePointer(&p, unsafe.Pointer(value)) }
建议:
虽然原子原语提供了一种执行原子操作的便捷方法,但它们可以容易出错。在 Go 中通常首选使用互斥体来保护对共享数据的并发访问。
以上是Go 中的指针赋值是原子的吗?的详细内容。更多信息请关注PHP中文网其他相关文章!