WaitGroup 동기화를 위한 wg.Add() 배치 수정
Go에서 sync.WaitGroup 유형은 고루틴 간의 동기화를 제공합니다. 주요 목적은 기본 고루틴이 고루틴 그룹이 작업을 완료할 때까지 기다릴 수 있도록 하는 것입니다. 그러나 적절한 동기화를 위해서는 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(1) 호출은 익명 함수는 실수입니다. 이러한 잘못된 배치는 동일한 고루틴 내에서 wg.Done() 후에 wg.Add(1)이 실행되기 때문에 wg.Wait()가 조기에 반환되는 상황으로 이어질 수 있습니다. 결과적으로 v는 완료된 작업 수를 정확하게 반영하지 않으며 그 값은 100보다 작을 가능성이 높습니다.
수정된 예에서:
<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( 1) 호출은 이제 익명 함수 외부에 배치되어 wg.Wait()를 호출하기 전에 기본 고루틴이 100개의 고루틴을 모두 호출하고 완료 작업을 wg에 등록했는지 확인합니다. 이렇게 올바르게 배치하면 100개의 고루틴이 모두 작업을 완료할 때까지 wg.Wait()가 차단되어 v의 정확한 값이 생성됩니다.
sync.WaitGroup 사용에 대한 일반 규칙:
sync.WaitGroup을 사용하여 성공적인 동기화를 보장하려면 다음 지침을 따르세요.
위 내용은 Go\의 `sync.WaitGroup`에서 적절한 동기화를 위해 `wg.Add()` 배치가 중요한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!