> 백엔드 개발 > Golang > 내 Go 동시성 코드가 1부터 5까지 대신 6을 6번 인쇄하는 이유는 무엇입니까?

내 Go 동시성 코드가 1부터 5까지 대신 6을 6번 인쇄하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-12-02 00:39:10
원래의
346명이 탐색했습니다.

Why Does My Go Concurrency Code Print 6 Six Times Instead of 1 Through 5?

Go 동시성: for 루프에서 익명 함수의 놀라운 동작 탐색

이 탐색에서 우리는 예상치 못한 사실을 밝혀낼 것입니다. for 루프와 익명을 사용할 때 Go 동시성이 나타내는 동작

문제:

sync.WaitGroup을 사용하여 동시성을 테스트하기 위해 다음 코드 조각을 실행한다고 상상해 보세요.

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()
}
로그인 후 복사

놀랍게도 출력이 관찰되었습니다. 이전: 예상된 순서 대신 6, 6, 6, 6, 6, 1, 2, 3, 4, 5.

설명:

이 동작을 이해하려면 Go FAQ에서 "고루틴으로 실행되는 클로저는 어떻게 되나요?"를 참조하세요. . 이 시나리오에서는 for 루프가 완료될 때까지 고루틴이 예약되지 않았습니다. 결과적으로 그 시점에서 i는 6으로 발전했습니다. goroutine이 실행될 때 그들은 모두 i의 캡처된 값인 6을 인쇄했습니다.

i를 익명 함수에 인수로 전달하면 효과적으로 현재 값, 호출 당시의 값을 캡처합니다. 이는 수정된 코드 버전에서 관찰되는 예상 동작을 설명합니다.

위 내용은 내 Go 동시성 코드가 1부터 5까지 대신 6을 6번 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿