>  기사  >  백엔드 개발  >  Go의 메모리 모델이 동시 고루틴에서 예기치 않은 출력을 허용하는 이유는 무엇입니까?

Go의 메모리 모델이 동시 고루틴에서 예기치 않은 출력을 허용하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-25 00:42:10260검색

Why Does Go's Memory Model Allow Unexpected Output in Concurrent Goroutines?

Go Lang의 잘못된 동기화

Go 메모리 모델은 단일 goroutine에서 읽기 및 쓰기가 마치 실행된 것처럼 동작해야 한다고 지정합니다. 프로그램에서 지정한 순서입니다. 그러나 여러 고루틴을 사용할 때 다음 코드와 같이 특이한 동작이 발생합니다.

var a, b int

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

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

func main() {
    go f()
    g()
}

문서에 따르면 코드가 "2"를 먼저 인쇄한 다음 대신 "0"을 인쇄하는 것이 가능합니다. 예상되는 "1"과 "2"입니다. 왜 이런 일이 발생합니까?

코드에서 순차적으로 나타나더라도 f 고루틴 내에서는 a와 b에 대한 할당이 순서 없이 발생할 수 있습니다. 고루틴은 할당 후 변수를 사용하지 않기 때문에 컴파일러는 변수를 재정렬하여 최적화할 수 있습니다.

그러나 f와 g 고루틴 간의 동기화가 부족하다는 것은 컴파일러가 인쇄 시 일관성을 보장하지 않는다는 것을 의미합니다. 결과적으로 동일한 고루틴에서 두 할당이 모두 발생할 때 a보다 먼저 b의 값을 관찰할 수 있습니다.

정확성을 보장하려면 고루틴 간의 동기화가 필요합니다. 동기화 지점에서 컴파일러는 두 할당이 모두 완료되었음을 보장합니다. 예를 들어 인쇄 호출 전에 동기화 지점이 배치되면 새 값(2 및 1)이 올바르게 인쇄되어 잘못된 동작을 방지합니다.

위 내용은 Go의 메모리 모델이 동시 고루틴에서 예기치 않은 출력을 허용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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