>백엔드 개발 >Golang >`sync.WaitGroup`을 사용하면 '치명적인 오류: 모든 고루틴이 잠자기 상태입니다. 교착 상태입니다!'가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

`sync.WaitGroup`을 사용하면 '치명적인 오류: 모든 고루틴이 잠자기 상태입니다. 교착 상태입니다!'가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-04 20:52:13336검색

Why Does Using `sync.WaitGroup` Lead to

sync.WaitGroup 사용 시 "치명적인 오류: 모든 고루틴이 잠들어 있음 - 교착 상태" 이해 및 해결

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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