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 중국어 웹사이트의 기타 관련 기사를 참조하세요!