"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 내 고루틴의 값이 다른 사람에게 표시되지 않는 이유는 무엇입니까?

내 고루틴의 값이 다른 사람에게 표시되지 않는 이유는 무엇입니까?

2024년 12월 21일에 게시됨
검색:591

Why Is My Goroutine\'s Value Not Visible to Others?

이것은 Go 컴파일러가 코드를 최적화했기 때문인가요?

이 문제는 Go 컴파일러의 최적화가 아니라 동기화 부족입니다. i에 대한 할당에는 동기화 이벤트가 따르지 않으므로 다른 고루틴에서 관찰된다는 보장이 없습니다. 실제로, 공격적인 컴파일러는 전체 i 문을 삭제할 수도 있습니다.

Go 메모리 모델

Go 메모리 모델은 하나의 변수를 읽는 조건을 지정합니다. 고루틴은 다른 고루틴의 동일한 변수에 대한 쓰기로 생성된 값을 관찰하도록 보장할 수 있습니다.

액세스를 직렬화하려면 채널 작업이나 다음과 같은 기타 동기화 프리미티브를 사용하여 데이터를 보호하세요. sync 및 sync/atomic 패키지.

프로그램의 동작을 이해하기 위해 이 문서의 나머지 부분을 읽어야 한다면 너무 영리한 것입니다. 영리하게 생각하지 마십시오.

동기화

다음 예에서 a에 대한 할당 뒤에는 동기화 이벤트가 따르지 않으므로 관찰이 보장되지 않습니다. 다른 고루틴에 의해. 실제로 공격적인 컴파일러는 전체 go 문을 삭제할 수도 있습니다.

var a string

func hello() {
  go func() { a = "hello" }()
  print(a)
}

다음 예에서는 sync.Mutex.

package main

import (
    "sync"
    "time"
)

func main() {
    mx := new(sync.Mutex)
    i := 1
    go func() {
        for {
            mx.Lock()
            i  
            mx.Unlock()
        }
    }()
    
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3