>  기사  >  백엔드 개발  >  외부 함수와 함께 sync.WaitGroup을 사용할 때 교착 상태를 방지하는 방법은 무엇입니까?

외부 함수와 함께 sync.WaitGroup을 사용할 때 교착 상태를 방지하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-06 05:06:02582검색

How to Avoid Deadlock When Using sync.WaitGroup with an External Function?

외부 기능과 함께 sync.WaitGroup의 최적 사용

문제:

동기화 구현. 외부 함수가 있는 WaitGroup이 1부터 11까지의 숫자를 인쇄하려고 할 때 교착 상태를 일으킵니다. 특히 wg.Wait() 줄에서 오류가 발생합니다.

해결 방법 1(잘못된 접근 방식):

2 대신 wg.Add(1)를 설정하는 것은 근본적인 문제를 해결하지 못하므로 잘못된 해결 방법입니다.

해결 방법 2(개선된 접근 방식):

다음과 같이 코드를 수정합니다.

  • 메인 함수에서 &wg를 사용하여 sync.WaitGroup의 주소를 Print 함수에 전달합니다.
  • wg를 제거합니다. Print 함수 시그니처의 매개변수입니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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