> 백엔드 개발 > Golang > Parallel Go 루틴에서 공유 데이터를 안전하게 읽는 방법은 무엇입니까?

Parallel Go 루틴에서 공유 데이터를 안전하게 읽는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2025-01-02 14:31:39
원래의
363명이 탐색했습니다.

How to Safely Read Shared Data from Parallel Go Routines?

병렬 Go 루틴에서 공유 데이터 값 읽기

문제:

Go에서 데이터를 안전하게 읽는 방법 병렬 컴퓨팅의 별도 스레드에서? 구체적으로, 데이터 무결성을 손상시키지 않고 어떻게 작업자 스레드에서 데이터를 수집할 수 있습니까?

시나리오:

메인 스레드는 비동기식으로 실행되는 여러 작업자 인스턴스를 생성합니다. 10초마다 메인 스레드는 작업자로부터 값(예: 반복 횟수)을 수집하고 통합 보고서를 표시해야 합니다.

질문:

안전합니까? 작업자로부터 값을 직접 읽습니까? 또한 이 요구 사항을 효율적으로 구현하기 위한 대체 접근 방식이 있습니까?

답변:

워커에서 값을 직접 읽는 것은 Go의 동시성 모델을 위반하기 때문에 안전하지 않습니다. Go에서는 동시 쓰기 작업으로 인한 데이터 손상을 방지하기 위해 고루틴 간에 공유되는 데이터를 동기화 메커니즘으로 보호해야 합니다.

이 문제를 해결하기 위한 한 가지 접근 방식은 sync.RWMutex 데이터 구조를 사용하는 것입니다.

  • 쓰기 잠금: 공유 데이터를 수정할 때 작업자가 획득하여 독점을 보장합니다. access.
  • 읽기 잠금: 공유 데이터를 읽을 때 메인 스레드에 의해 획득되어 동시 읽기는 허용하지만 쓰기는 방지합니다.

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 패키지는 다음을 보장하는 원자적 작업을 제공합니다. 공유 변수에 대한 스레드로부터 안전한 액세스. 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)
}
로그인 후 복사

이러한 방법을 활용함으로써 두 접근 방식 모두 데이터 무결성을 유지하면서 별도의 스레드에서 값을 읽을 수 있는 강력한 솔루션을 제공합니다.

위 내용은 Parallel Go 루틴에서 공유 데이터를 안전하게 읽는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿