Go에서 포인터의 원자적 할당
Golang에서 포인터를 원자적으로 할당하는 것이 가능합니까? 특히, 포인터를 nil로 설정하고 다른 스레드가 변경 사항을 즉시 관찰할 수 있도록 하려면 잠금을 사용해야 합니까?
Java에서는 휘발성 키워드를 사용하여 원자 포인터 할당을 달성할 수 있습니다. 하지만 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() }
이러한 함수는 스레드를 유지하면서 포인터에 대한 액세스를 제공합니다. 뮤텍스를 사용하여 안전합니다.
또는 가능하다면 포인터 액세스를 단일 고루틴으로 제한하고 사용하는 것이 더 관용적일 수 있습니다.
atomic.StorePointer 사용
잠금을 사용하는 대신 sync/atomic 패키지는 원자 포인터 할당을 위한 StorePointer 기능을 제공합니다. 그러나 이 접근 방식을 사용하려면 unsafe.Pointer를 사용해야 하며 오류 및 정의되지 않은 동작이 발생할 가능성이 있으므로 모범 사례로 간주되지 않습니다.
위 내용은 Go에서 원자 포인터 할당이 가능하며 어떻게 안전하게 달성할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!