외부 기능과 함께 sync.WaitGroup의 최적 사용
문제:
동기화 구현. 외부 함수가 있는 WaitGroup이 1부터 11까지의 숫자를 인쇄하려고 할 때 교착 상태를 일으킵니다. 특히 wg.Wait() 줄에서 오류가 발생합니다.
해결 방법 1(잘못된 접근 방식):
2 대신 wg.Add(1)를 설정하는 것은 근본적인 문제를 해결하지 못하므로 잘못된 해결 방법입니다.
해결 방법 2(개선된 접근 방식):
다음과 같이 코드를 수정합니다.
<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) 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) } wg.Done() }</code>
설명:
wg의 주소를 Print에 전달하면 동일한 WaitGroup 인스턴스가 조작되고 있음을 보장합니다. Print 함수 시그니처에서 wg를 제거하면 함수가 외부 WaitGroup에 대해 알 필요가 없습니다.
결론:
두 번째 솔루션은 다음을 방지하는 보다 강력한 접근 방식입니다. wg에서 인쇄 기능의 교착 상태를 유지하고 독립성을 유지합니다.
위 내용은 외부 함수와 함께 sync.WaitGroup을 사용할 때 교착 상태를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!