sync.WaitGroup을 사용하여 여러 고루틴 완료를 조정하려고 할 때 , "치명적인 오류: 모든 고루틴이 잠자기 상태입니다. 교착 상태입니다!"라는 오류가 발생할 수 있습니다. 이 비밀스러운 메시지는 특히 코드가 문서 예제에 따라 작성된 것처럼 보일 때 혼란스러울 수 있습니다.
이 오류의 원인은 Go가 함수에 전달된 값을 처리하는 방식에 있습니다. sync.WaitGroup 객체를 직접 전달할 때 Go는 해당 값의 복사본을 생성하여 기본적으로 각 고루틴에 다른 객체를 전달합니다. 이로 인해 원본 WaitGroup과 고루틴이 작동하는 복사본 사이의 연결이 끊어집니다.
이 문제에 대한 해결책은 대신 sync.WaitGroup에 포인터를 전달하는 것입니다. 그렇게 하면 모든 고루틴은 동일한 기본 객체를 참조하고 내부 카운터에서 일관되게 작동합니다. 포인터를 사용하는 올바른 코드는 아래에 제공됩니다.
import "sync" func doWork(wg *sync.WaitGroup) error { defer wg.Done() // Do some heavy lifting... request URL's or similar return nil } func main() { wg := &sync.WaitGroup{} // Use pointer to pass the WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go doWork(wg) } }
이러한 변경을 통해 고루틴은 작업을 시작하기 전에 카운터를 늘리고 완료 시 카운터를 감소시켜 WaitGroup 개체와 올바르게 상호 작용합니다. 결과적으로, 주 함수의 WaitGroup.Wait() 호출은 무기한 차단되지 않으며 프로그램은 예상대로 실행됩니다.
위 내용은 `sync.WaitGroup`을 사용하면 '치명적인 오류: 모든 고루틴이 잠자기 상태입니다. 교착 상태입니다!'가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!