首頁 >後端開發 >Golang >為什麼 Go 的 `go f(); g()` 印出'20”而不是'21”?

為什麼 Go 的 `go f(); g()` 印出'20”而不是'21”?

DDD
DDD原創
2024-11-23 15:00:17768瀏覽

Why Might Go's `go f(); g()` Print

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn