고동시 시스템의 글로벌 카운터
질문: 공유 글로벌 카운터를 생성하려면 어떻게 해야 합니까? 고도의 동시성 시스템에서 중복 없이 여러 고루틴에 의해 액세스됩니까?
이전 질문을 참조하여 일반적으로 공유 카운터에 권장되지 않는 채널 카운터를 사용하려고 한다고 언급하셨습니다. 일부 시나리오에서는 작동할 수 있지만 동시성이 높은 상황에서는 문제가 됩니다.
답변:
1. 원자 패키지:
공유 카운터를 구현하는 가장 효과적인 접근 방식은 Go에서 제공하는 원자 패키지를 이용하는 것입니다. 원자적 작업은 공유 데이터의 변경 사항이 분할할 수 없는 단일 작업으로 실행되도록 보장하여 경합 상태를 효과적으로 방지합니다.
예:
<code class="go">import "sync/atomic" var globalCounter int32 = 0 // Atomically updated counter func IncrementCounter() { atomic.AddInt32(&globalCounter, 1) // Atomically increments the counter } func ReadCounter() int32 { return atomic.LoadInt32(&globalCounter) // Atomically reads the counter's value }</code>
2. 동기화된 채널:
또 다른 옵션은 동기화된 채널을 사용하여 카운터 값을 공유하는 것입니다. 그러나 이 접근 방식은 효율성이 낮고 복잡성이 더 커집니다.
예:
<code class="go">var counter chan int = make(chan int, 1) func IncrementCounter() { counter <- 1 } func ReadCounter() int { return <-counter }</code>
제공된 코드 조각에서는 값 교환을 위한 채널을 활용하여 스레드로부터 안전한 카운터를 구현했습니다. . 그러나 값을 재설정하려면 스레드로부터 안전한 작업도 고려해야 합니다. 적절한 구현은 다음과 같습니다.
<code class="go">var addCounterChan chan int = make(chan int, 100) var readCounterChan chan int = make(chan int, 100) func AddCounter() { addCounterChan <- 1 } func GetCount() int { return <-readCounterChan }</code>
위 내용은 고도로 동시적인 Go 시스템에서 스레드로부터 안전한 글로벌 카운터를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!