首页 > 后端开发 > Golang > Go 中的指针赋值是原子的吗?

Go 中的指针赋值是原子的吗?

Patricia Arquette
发布: 2024-12-18 21:26:10
原创
638 人浏览过

Is Pointer Assignment in Go Atomic?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板