首页 >后端开发 >Golang >Go 中可以进行原子指针分配吗?如何安全地实现它?

Go 中可以进行原子指针分配吗?如何安全地实现它?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-12 11:08:10792浏览

Is Atomic Pointer Assignment Possible in Go, and How Can It Be Achieved Safely?

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

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