>백엔드 개발 >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) 한 번에 하나의 고루틴만 포인터에 액세스할 수 있도록 하여 경합 조건을 방지합니다.
  2. 원자 기본 요소 사용: sync.atomic 패키지는omic.StorePointer 및omic.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에서 관용적으로 간주되는 반면 원자 기본 요소를 사용하는 것은 권장하지 않습니다.
  • 대체 접근 방식은 포인터 액세스에 단일 고루틴을 사용하고 채널을 통해 명령을 전달하는 것인데, 이는 Go의 동시성 모델에 더 잘 맞습니다.

위 내용은 Go에서 포인터 할당은 원자적이며 어떻게 안전하게 만들 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.