>백엔드 개발 >Golang >Go에서 다른 고루틴의 값을 안전하게 읽는 방법은 무엇입니까?

Go에서 다른 고루틴의 값을 안전하게 읽는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-25 09:53:35422검색

How to Safely Read Values from Different Goroutines in Go?

다른 스레드에서 값을 읽는 것이 안전한가요?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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