首頁 > 後端開發 > Golang > 為什麼我的 Goroutine 的值對其他人不可見?

為什麼我的 Goroutine 的值對其他人不可見?

Linda Hamilton
發布: 2024-10-29 11:37:30
原創
696 人瀏覽過

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

這是因為 go 編譯器最佳化了程式碼嗎?

問題不是 Go 編譯器最佳化,而是缺乏同步。對 i 的賦值後面沒有任何同步事件,因此不能保證任何其他 goroutine 都會觀察到它。事實上,激進的編譯器可能會刪除整個 i 語句。

Go 記憶體模型

Go 記憶體模型指定在一個變數中讀取變數的條件可以保證goroutine 觀察到在不同goroutine 中寫入同一變數所產生的值。

要序列化訪問,請使用通道操作或其他同步原語(例如sync和sync/atomic包中的同步原語)保護資料.

如果您必須閱讀本文檔的其餘部分才能理解程式的行為,那您就太聰明了。別自作聰明。

同步

在下面的範例中,對 a 的賦值後面沒有任何同步事件,因此不保證能夠被觀察到由任何其他 goroutine 執行。事實上,激進的編譯器可能會刪除整個 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>
登入後複製

以上是為什麼我的 Goroutine 的值對其他人不可見?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板