>백엔드 개발 >Golang >My Go 동시성 예제가 고유 번호 대신 \'6\'을 5번 인쇄하는 이유는 무엇입니까?

My Go 동시성 예제가 고유 번호 대신 \'6\'을 5번 인쇄하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-06 03:07:11480검색

Why Does My Go Concurrency Example Print

for 루프 및 익명 함수 여기를 사용한 Go 동시성

Go의 sync.WaitGroup을 사용하여 동시성 이해력을 향상시키려는 개발자는 다음과 같은 문제에 직면했습니다. Amazon S3에 대한 다중 업로드를 용이하게 하도록 설계된 코드로 인한 예상치 못한 동작. 초기 코드 조각은 다음과 같습니다.

func main() {

    var wg sync.WaitGroup

    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go func() {
            fmt.Println(i)
            time.Sleep(time.Second * 1)
            wg.Done()
        }()
    }

    wg.Wait()
}

개발자가 놀랍게도 출력에는 "2, 4, 1과 같은 예상 순서에서 벗어나 "6, 6, 6, 6, 6"이 일관되게 표시되었습니다. , 5, 3." 루프가 5까지 반복되면서 예상치 못한 6이라는 결과가 나타났습니다. i를 익명 함수 내의 인수로 통합한 후속 수정을 통해 의도한 출력이 생성되었습니다.

이유 공개

Go의 클로저에 대한 문서에서 이 동작을 밝힙니다. for 루프가 진행됨에 따라 클로저는 정의 당시의 i 값을 캡처합니다. 따라서 i가 5에 도달한 후 루프가 종료되더라도 고루틴은 공유 값 6으로 실행되어 최종적으로 "6, 6, 6, 6, 6"을 인쇄합니다.

i를 인수로 전달하면 a 새 변수는 선언 순간의 i 값을 캡처하여 원하는 결과를 얻습니다.

위 내용은 My Go 동시성 예제가 고유 번호 대신 \'6\'을 5번 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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