아래 Go 코드에서 변수 v는 종종 예상보다 작습니다. wg.Add()의 잘못된 배치에 대해.
<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()는 해당 고루틴을 시작하기 전에 항상 호출되어야 합니다. 고루틴이 wg.Done()을 실행했습니다.
<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.Add()가 고루틴 내부에 배치되면 모든 고루틴이 완료될 때까지 기본 고루틴이 차단된다는 것을 보장할 수 없습니다. . 이는 고루틴이 동시에 실행되고 실행 순서가 비결정적이기 때문입니다.
wg.Add()를 고루틴 앞에 배치하여 기본 고루틴이 도달하기 전에 wg.Add()를 100번 호출하도록 보장합니다. wg.잠깐(). 이렇게 하면 100개의 고루틴이 모두 wg.Done()을 호출할 때까지 기본 고루틴이 차단되어 v가 일관되게 100이 됩니다.
sync.WaitGroup을 사용할 때 다음을 따르세요. 지침:
위 내용은 Go에서 동기화를 보장하기 위해 wg.Add() 배치가 중요한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!