WaitGroup.Wait()는 메모리 장벽을 보장합니까?
다음 코드 조각을 고려하세요.
var condition bool var wg sync.WaitGroup for _, item := range items { wg.Add(1) go func(item) { if meetsCondition(item) { condition = true } wg.Done() }(item) } wg.Wait() // is it safe to check condition here?
wg.Wait()가 반환된 후 조건 변수를 확인하는 것이 안전한지 여부에 대한 질문이 발생합니다. 공식 Go 문서에는 메모리 장벽 관련 내용이 명시적으로 언급되어 있지 않지만 WaitGroup 문서에는 대기 그룹 카운터가 0에 도달할 때까지 대기가 차단된다고 명시되어 있습니다.
해결책
예, wg.Wait()가 반환된 후에 조건 변수를 확인하는 것이 안전합니다. wg.Wait()와 wg.Done() 사이에는 암시적인 사전 발생 관계가 있습니다. 고루틴이 wg.Done()을 호출하면 완료된 모든 작업이 이미 wg.Wait()를 호출한 다른 고루틴에 표시되도록 보장합니다. 따라서 wg.Wait()는 효과적으로 메모리 장벽 역할을 하여 wg.Wait()가 반환된 후 검사 전에 조건 변수가 업데이트되도록 보장합니다.
이러한 발생 전 관계는 명시적으로 문서화되지는 않았지만 이미 기록되었습니다. Go 개발자가 확인했습니다. 자세한 내용은 여기 Go 포럼 스레드를 참조하세요.
위 내용은 WaitGroup.Wait()는 Go에서 메모리 장벽 역할을 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!