首页 >后端开发 >Golang >Go 中的指针赋值是原子的吗?如何保证它的安全?

Go 中的指针赋值是原子的吗?如何保证它的安全?

Linda Hamilton
Linda Hamilton原创
2024-12-24 14:09:10294浏览

Is Pointer Assignment Atomic in Go, and How Can It Be Made Safe?

Go 中原子分配指针

Go 提供了多种管理并发的工具,但经常出现的一个问题是是否分配指针是一个原子操作。

原子操作Go

在 Go 中,唯一保证原子性的操作是在sync.atomic 包中找到的操作。因此,分配指针本身并不是原子的。

安全指针分配

要原子地分配指针,您有两个选项:

  1. 获取锁:使用锁(例如,sync.Mutex)确保一次只有一个 goroutine 可以访问指针,从而防止竞争条件。
  2. 使用原子原语:sync.atomic 包提供了原子原语,例如atomic.StorePointer 和atomic.LoadPointer,它们可用于自动分配和检索指针值。

示例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))
}

注意事项

  • 使用sync.atomic可能会使代码复杂化,因为需要转换为unsafe.Pointer。
  • 在 Go 中,锁通常被认为是惯用的,而使用原子原语则是
  • 另一种方法是使用单个 goroutine 进行指针访问并通过通道传达命令,这更符合 Go 的并发模型。

以上是Go 中的指针赋值是原子的吗?如何保证它的安全?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn