>백엔드 개발 >Golang >Go에서 여러 고루틴의 값을 어떻게 안전하게 읽을 수 있나요?

Go에서 여러 고루틴의 값을 어떻게 안전하게 읽을 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-12-25 05:03:21920검색

How Can I Safely Read Values from Multiple Goroutines in Go?

Go의 다른 스레드에서 안전하게 값 읽기

Go에서는 적절한 동기화 없이 여러 고루틴의 값에 동시에 액세스하는 것은 위험합니다. 데이터 무결성을 보장하려면 동기화 메커니즘을 사용하는 것이 중요합니다.

뮤텍스 및 읽기/쓰기 잠금을 사용한 동기화

주어진 시나리오에서는 기본 스레드가 데이터를 수집해야 합니다. 10초마다 작업자 스레드의 값을 가져오므로 채널로는 충분하지 않습니다. 대신 읽기/쓰기 뮤텍스를 사용할 수 있습니다.

워커는 값을 업데이트할 때 쓰기 잠금을 획득하고, 메인 스레드는 값을 검색할 때 읽기 잠금을 획득합니다. 이는 경쟁 조건을 방지하고 데이터 일관성을 보장합니다.

뮤텍스를 사용한 구현 예

다음 코드는 뮤텍스를 사용한 간단한 구현을 보여줍니다.

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()
}

대안: Atomic 사용 카운터

또는 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)
}

위 내용은 Go에서 여러 고루틴의 값을 어떻게 안전하게 읽을 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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