> 백엔드 개발 > Golang > 내 Go 루틴이 메모리 재정렬로 인해 예기치 않은 값을 인쇄하는 이유는 무엇입니까?

내 Go 루틴이 메모리 재정렬로 인해 예기치 않은 값을 인쇄하는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-11-23 06:58:17
원래의
491명이 탐색했습니다.

Why Does My Go Routine Print Unexpected Values Due to Memory Reordering?

Go 루틴 문제: 잘못된 동기화

GoLang에서 겪은 문제는 GoLang의 메모리 모델에서 비롯됩니다. 문서에 따르면, 단일 고루틴 내에서 읽기 및 쓰기는 해당 고루틴 내의 동작에 영향을 주지 않는 한 재정렬될 수 있습니다.

다음 코드를 고려하세요.

var a, b int

func f() {
    a = 1
    b = 2
}

func g() {
    print(b)
    print(a)
}

func main() {
    go f()
    g()
}
로그인 후 복사

기한 메모리 모델의 재정렬에서 g()가 2를 인쇄한 다음 0을 인쇄하는 것을 볼 수 있습니다. f()에서 a의 할당이 b보다 앞에 오더라도, 컴파일러는 효율성을 위해 b를 먼저 할당하여 코드를 최적화할 수 있습니다.

동일한 고루틴 내에서는 문제가 발생할 경우 컴파일러가 할당 순서를 변경할 수 없으므로 할당 순서가 보장됩니다. 그러나 주어진 예에서는 두 고루틴 간에 동기화가 없습니다. 따라서 컴파일러는 재정렬이 다른 고루틴에 미치는 잠재적인 영향을 고려할 필요가 없습니다.

WaitGroup 또는 뮤텍스와 같은 고루틴 간의 동기화를 도입하는 경우 컴파일러는 불일치가 없는지 확인합니다. 동기화 지점에서. 이 경우 g()는 2와 1을 인쇄할 것으로 예상할 수 있습니다. 두 할당 모두 print() 호출 전에 완료되기 때문입니다.

GoLang 메모리 모델의 이러한 측면을 이해하는 것은 동시 프로그램을 작성하고 동시성 프로그램을 방지하는 데 매우 중요합니다. 예상치 못한 재정렬로 인해 발생할 수 있는 잠재적인 경쟁 상황이나 기타 문제.

위 내용은 내 Go 루틴이 메모리 재정렬로 인해 예기치 않은 값을 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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