다른 스레드에서 값을 읽는 것이 안전한가요?
Go에서 값에 안전하게 동시 액세스하려면 여러 고루틴이 포함될 때, 특히 다음과 같은 경우 동기화가 필요합니다. 그 중 적어도 하나는 쓰기를 수행합니다. 주어진 시나리오에서는 정의되지 않은 동작을 방지하기 위해 동기화를 구현해야 합니다.
권장 접근 방식: 뮤텍스 활용
채널은 메시지 전달 옵션이지만 기본 스레드에서 메시지 검색에 필요한 동기화로 인해 불필요한 복잡성이 발생합니다. 대신 읽기-쓰기 뮤텍스(sync.RWMutex)를 사용하는 것이 좋습니다. 이러한 잠금은 수정 작업(작업자)에 잠금 획득을 적용하고 상태 검색(메인 스레드)에 읽기 전용 액세스를 적용하여 데이터를 보호합니다.
구현 예
type Worker struct { iterMu sync.RWMutex iter int } func (w *Worker) Iter() int { w.iterMu.RLock() defer w.iterMu.RUnlock() return w.iter } func (w *Worker) setIter(n int) { w.iterMu.Lock() w.iter = n w.iterMu.Unlock() }
이 접근 방식을 사용하면 반복 횟수를 수정하는 작업자는 쓰기 잠금을 획득하고, 횟수를 읽는 기본 스레드는 읽기 잠금을 획득합니다. 잠금.
대체: 원자 연산
sync/atomic 패키지는 정수와 같은 특정 데이터 유형을 동기화 없이 수정할 수 있는 원자 연산을 제공합니다. 읽기 및 수정 작업을 원자 함수로 제한하여 무결성을 보장합니다.
type Worker struct { iter int64 } func (w *Worker) Iter() int64 { return atomic.LoadInt64(&w.iter) } func (w *Worker) setIter(n int64) { atomic.StoreInt64(&w.iter, n) } func (w *Worker) incIter() { atomic.AddInt64(&w.iter, 1) }
이 접근 방식은 더 간단한 동기화 메커니즘을 제공하지만 특정 데이터 유형에만 적용할 수 있다는 점에 유의하세요.
채택함으로써 이러한 방법 중 하나를 사용하면 서로 다른 스레드의 작업자로부터 값을 안전하게 읽어 데이터 무결성을 보장하고 정의되지 않은 동작을 방지할 수 있습니다.
위 내용은 Go에서 다른 고루틴의 값을 안전하게 읽는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!