Go에서 원자적으로 포인터 할당
Go는 동시성 관리를 위한 다양한 도구를 제공하지만 자주 발생하는 한 가지 질문은 포인터를 할당할지 여부입니다. 원자적 연산입니다.
원자적 연산 Go
Go에서 원자성이 보장되는 유일한 작업은 sync.atomic 패키지에 있는 작업입니다. 따라서 포인터 할당은 기본적으로 원자적이지 않습니다.
안전한 포인터 할당
포인터를 원자적으로 할당하려면 다음 두 가지 옵션이 있습니다.
예제 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)) }
고려 사항
위 내용은 Go에서 포인터 할당은 원자적이며 어떻게 안전하게 만들 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!