>백엔드 개발 >Golang >Go에서 올바른 고루틴 동기화를 위해 `wg.Add()` 및 `wg.Done()`을 어디에 배치해야 합니까?

Go에서 올바른 고루틴 동기화를 위해 `wg.Add()` 및 `wg.Done()`을 어디에 배치해야 합니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-04 05:28:29868검색

 Where Should You Place `wg.Add()` and `wg.Done()` for Correct Goroutine Synchronization in Go?

고루틴 동기화를 위한 WaitGroup 삽입 배치

Go에서 sync.WaitGroup 유형은 활성 개수를 추적하여 고루틴 간의 동기화를 용이하게 합니다. 고루틴을 실행하고 더 진행하기 전에 모든 고루틴이 실행을 마칠 때까지 기다립니다. 올바른 동작을 보장하려면 wg.Add() 및 wg.Done() 호출을 올바르게 배치하는 것이 중요합니다.

다음 코드를 고려하세요.

<code class="go">var wg sync.WaitGroup
var v int32 = 0 
for i = 0; i < 100; i++{
   go func(){
       wg.Add(1) // wrong place
       atomic.AddInt32(&v,1)
       wg.Done()
   } 
}
wg.Wait()
fmt.Println(v)</code>

이 예에서 wg.Add( 1) 익명 함수 내에 실수로 배치되었습니다. 이렇게 잘못된 배치로 인해 v 값이 일관되지 않을 수 있으며 종종 100보다 작습니다.

이러한 불일치의 이유는 고루틴의 동시성 특성에 있습니다. 고루틴 내에 배치되면 wg.Add(1)가 wg.Done()과 동시에 실행되어 wg.Wait()가 조기에 재개되고 완료된 고루틴 수가 과소평가될 수 있습니다.

이 문제를 해결하려면, wg.Add(1)는 각 고루틴을 시작하기 전에 for 루프에 배치되어야 합니다.

<code class="go">var wg sync.WaitGroup
var v int32 = 0 
for i = 0; i < 100; i++{
   wg.Add(1)
   go func(){
       atomic.AddInt32(&v,1)
       wg.Done()
   } 
}
wg.Wait()
fmt.Println(v)</code>

이 조정은 모든 wg.Done() 호출이 이루어질 때까지 wg.Wait()가 차단되도록 보장합니다. v가 완료된 고루틴 수를 정확하게 반영할 수 있습니다.

요약하자면, 고루틴을 시작하기 전에 항상 wg.Add()를 배치하고, 고루틴이 실행을 완료한 후에는 wg.Done()을 배치하여 적절한 동기화와 안정적인 결과를 보장하세요. 계산.

위 내용은 Go에서 올바른 고루틴 동기화를 위해 `wg.Add()` 및 `wg.Done()`을 어디에 배치해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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