Go에서 포인터 할당의 원자성
Go에서 포인터를 할당합니까? 즉, 정의되지 않은 동작을 일으키지 않고 여러 스레드가 동시에 포인터를 조작할 수 있습니까?
답변:
Go의 원자적 작업은 동기화에서 명시적으로 정의된 작업으로 제한됩니다. 원자 패키지. 따라서 일반 포인터 할당은 원자성이 보장되지 않습니다.
스레드 전체에서 일관된 동작을 보장하려면 두 가지 옵션이 있습니다:
1. 잠금을 사용한 동기화:
sync.Mutex와 같은 동기화 기본 요소를 사용하여 포인터에 대한 액세스를 보호합니다. 예:
var p *int var lock sync.Mutex func GetPointer() *int { lock.Lock() defer lock.Unlock() return p } func SetPointer(value *int) { lock.Lock() p = value lock.Unlock() }
2. 원자 기본 형식(주의 사항):
또는 sync.atomic을 사용하여 원자 포인터 할당을 수행할 수도 있습니다. 그러나 이 접근 방식에서는 안전하지 않은 포인터 변환을 주의 깊게 처리해야 합니다.
import ( "sync/atomic" "unsafe" ) var p = unsafe.Pointer(nil) func SetPointer(value *int) { atomic.StorePointer(&p, unsafe.Pointer(value)) }
권장 사항:
원자 프리미티브는 원자 작업을 수행하는 편리한 방법을 제공하지만 다음과 같은 작업이 가능합니다. 오류가 발생하기 쉽습니다. Go에서는 공유 데이터에 대한 동시 액세스를 보호하기 위해 일반적으로 뮤텍스를 사용하는 것이 선호됩니다.
위 내용은 Go Atomic에서 포인터 할당이 이루어지나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!