문제는 Go 컴파일러의 최적화가 아니라 오히려 동기화 부족입니다. i에 대한 할당에는 동기화 이벤트가 따르지 않으므로 다른 고루틴에서 관찰된다는 보장이 없습니다. 실제로 공격적인 컴파일러는 i 문 전체를 삭제할 수도 있습니다.
Go 메모리 모델
Go 메모리 모델은 하나의 변수를 읽는 조건을 지정합니다. 고루틴은 다른 고루틴의 동일한 변수에 대한 쓰기로 생성된 값을 관찰하도록 보장할 수 있습니다.
액세스를 직렬화하려면 채널 작업이나 sync 및 sync/atomic 패키지와 같은 기타 동기화 프리미티브를 사용하여 데이터를 보호하세요. .
프로그램의 동작을 이해하기 위해 이 문서의 나머지 부분을 읽어야 한다면 너무 영리한 것입니다. 당황하지 마십시오.
동기화
다음 예에서 a에 대한 할당 뒤에는 동기화 이벤트가 따르지 않으므로 관찰이 보장되지 않습니다. 다른 고루틴에 의해. 실제로 공격적인 컴파일러는 go 문 전체를 삭제할 수도 있습니다.
<code class="go">var a string func hello() { go func() { a = "hello" }() print(a) }</code>
다음 예에서는 sync.Mutex를 사용하여 i에 대한 액세스를 직렬화하는 방법을 보여줍니다.
<code class="go">package main import ( "sync" "time" ) func main() { mx := new(sync.Mutex) i := 1 go func() { for { mx.Lock() i++ mx.Unlock() } }() <-time.After(1 * time.Second) mx.Lock() println(i) mx.Unlock() }</code>
위 내용은 내 고루틴의 값이 다른 사람에게 표시되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!