프로그램에서 기본 함수 외부에 정의된 함수와 함께 sync.WaitGroup을 사용할 때 문제가 발생할 수 있습니다. 이 상황을 살펴보겠습니다.
문제:
다음 코드를 고려하세요.
<code class="go">package main import ( "fmt" "sync" ) func main() { ch := make(chan int) var wg sync.WaitGroup wg.Add(2) go Print(ch, wg) // go func(){ for i := 1; i <= 11; i++ { ch <- i } close(ch) defer wg.Done() }() wg.Wait() //deadlock here } // Print prints all numbers sent on the channel. // The function returns when the channel is closed. func Print(ch <-chan int, wg sync.WaitGroup) { for n := range ch { // reads from channel until it's closed fmt.Println(n) } defer wg.Done() }</code>
여기서 프로그램이 숫자를 인쇄하도록 목표로 합니다. 1부터 11까지이지만 가끔 1부터 10까지만 인쇄됩니다.
오류 분석:
sync.WaitGroup의 복사본을 Print 함수에 전달하고 있습니다. 이는 기본 함수에서 기다리고 있는 sync.WaitGroup의 Done() 메서드를 호출하지 않는다는 의미입니다.
해결책:
이 문제를 해결하려면 , 다음과 같이 코드를 업데이트합니다.
<code class="go">package main import ( "fmt" "sync" ) func main() { ch := make(chan int) var wg sync.WaitGroup wg.Add(2) go Print(ch, &wg) go func() { for i := 1; i <= 11; i++ { ch <- i } close(ch) defer wg.Done() }() wg.Wait() //deadlock here } func Print(ch <-chan int, wg *sync.WaitGroup) { for n := range ch { // reads from channel until it's closed fmt.Println(n) } defer wg.Done() }</code>
이렇게 하면 Print 함수가 기본 함수에서 기다리고 있는 동일한 sync.WaitGroup에서 Done() 메서드를 호출하게 됩니다.
또는 코드를 재구성하여 인쇄 기능에서 sync.WaitGroup에 대한 의존도를 제거할 수 있습니다.
<code class="go">package main import ( "fmt" ) func main() { ch := make(chan int) go func() { for i := 1; i <= 11; i++ { ch <- i } close(ch) }() for n := range ch { // reads from channel until it's closed fmt.Println(n) } }</code>
위 내용은 외부 함수와 함께 sync.WaitGroup을 사용하면 교착 상태가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!