Go Lang 中同步不正確
Go 記憶體模型文件解釋了以下程式碼可能會導致 g 列印2,然後0:
var a, b int
func f() {
a = 1
b = 2
}
func g() {
print(b)
print(a)
}
func main() {
go f()
g()
}
解釋:
- 在任何函數執行之前,變數 a 和 b 被初始化為零值 (0)。
- Go 記憶體模型中的 Happens Before 規則允許編譯器和處理器在單一 goroutine 中重新排序操作,如果重新排序不會影響其行為。
- 在 f() 函數中,如果重新排序不會在該 goroutine 中產生差異,則對 a 和 b 的賦值可能不會按指定順序發生。
- 由於賦值對 f() 函數沒有影響,出於效率原因,編譯器可能會對它們重新排序。
- 由於兩者之間沒有同步在提供的範例中,goroutines(即 f() 和 g()),編譯器不會嘗試確保它們之間的一致性。
- 但是,如果您在 goroutine 之間引入同步,編譯器將保證在同步點,兩個分配都將「完成」。這意味著正確的值(2 和 1)將被印在 g() 中。
以上是為什麼 Go 的 `go f(); g()` 印出'20”而不是'21”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!