ホームページ  >  記事  >  バックエンド開発  >  これは Go の競合状態ですか?

これは Go の競合状態ですか?

王林
王林転載
2024-02-15 09:06:08549ブラウズ

这是 Go 中的竞争条件吗

php エディタ Apple は、この記事でよくある質問に答えます: 「これは 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 が指摘したように、これはデータ競争です。また、一度しか書き込まれないため、検出するのは困難です。以下は、データ競合エラーを簡単に引き起こすことができる変更されたデモです:

リーリー

以上がこれは Go の競合状態ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。