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

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

王林
リリース: 2024-02-15 09:06:08
転載
658 人が閲覧しました

这是 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 サイトの他の関連記事を参照してください。

関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート