首頁  >  文章  >  後端開發  >  這是 Go 中的競爭條件嗎

這是 Go 中的競爭條件嗎

王林
王林轉載
2024-02-15 09:06:08508瀏覽

这是 Go 中的竞争条件吗

php小編蘋果在這篇文章中將為您解答一個常見的問題:「這是Go中的競爭條件嗎?」在編寫並發程式時,競爭條件是一個常見的問題,它可能導致數據不一致以及其他意想不到的結果。在Go語言中,我們可以使用互斥鎖、通道等機制來避免競爭條件的發生。讓我們一起來探討一下吧!

問題內容

func main() {
    m := map[string]int{
        "foo": 42,
        "bar": 1337,
    }

    go func() {
        time.Sleep(1 * time.Second)
        tmp := map[string]int{
            "foo": 44,
            "bar": 1339,
        }

        m = tmp
    }()

    for {
        val := m["foo"]
        fmt.Println(val)
    }
}

我在很多包中都看到了這個。

為什麼這不被視為競爭條件?

go run -race . 沒有錯誤。

解決方法

如@volker 所指出的,這是一場資料競賽。而且由於只有一次寫入,因此很難被偵測到。這是一個修改後的演示,可以輕鬆觸發資料爭用錯誤:

package main

import (
    "fmt"
    "time"
)

func main() {
    m := map[string]int{
        "foo": 42,
        "bar": 1337,
    }

    done := make(chan any)

    go func() {
        for i := 0; i < 100; i++ {
            time.Sleep(time.Microsecond)
            tmp := map[string]int{
                "foo": 44,
                "bar": 1339,
            }

            m = tmp
        }

        close(done)
    }()

    for {
        select {
        case <-done:
            return
        default:
            val := m["foo"]
            fmt.Println(val)
        }
    }
}

以上是這是 Go 中的競爭條件嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除