ホームページ > バックエンド開発 > Golang > ミューテックスによってロックされている場合にマップ オブジェクトを出力する

ミューテックスによってロックされている場合にマップ オブジェクトを出力する

PHPz
リリース: 2024-02-10 12:36:09
転載
859 人が閲覧しました

ミューテックスによってロックされている場合にマップ オブジェクトを出力する

php エディタ Xiaoxin は、ミューテックス ロックに関する実用的なヒント、つまり、マップ オブジェクトがミューテックス ロックによってロックされているときにマップ オブジェクトを印刷する方法を紹介します。ミューテックスは、ロックされたリソースに一度に 1 つのスレッドだけがアクセスできるようにすることで、共有リソースを保護するために使用されるメカニズムです。この記事では、ミューテックス ロックの使用方法とマップ オブジェクトへのアクセスについて理解を深めるために、ミューテックス ロックを使用してマップ オブジェクトを保護し、オブジェクトがロックされているときにマップの内容を出力する方法を説明します。

質問の内容

ミューテックスが期待どおりに動作しない理由がわかりません。あらゆる提案が私にとって役立ちます。

これは私のコードです。

リーリー

これを実行すると、奇妙な出力が得られます。

リーリー

一部のログでは a が 1,2,3,4

に増加することが予想されます

inc 関数内のコメントを削除すると、 期待どおりのログが表示されます。

package main

import (
    "fmt"
    "sync"
    "time"
)

type container struct {
    mu       sync.mutex
    counters map[string]int
}

func (c *container) inc(name string) {
    c.mu.lock()
    defer c.mu.unlock()
    c.counters[name]++
    
    // fmt.println("in", name, c.counters) 
    // this print is doing tricks between goroutines
    time.sleep(time.second)
}

func main() {
    c := container{

        counters: map[string]int{"a": 0, "b": 0},
    }

    var wg sync.waitgroup

    doincrement := func(name string, n int) {
        for i := 0; i < n; i++ {
            c.inc(name)
            fmt.println(name, c.counters)
        }
        wg.done()
    }

    wg.add(3)
    go doincrement("a", 2)
    go doincrement("b", 2)
    go doincrement("a", 2)

    wg.wait()
    fmt.println(c.counters)
}
ログイン後にコピー

解決策

このループ内:

リーリー

println はミューテックスの外で動作します。 2 つのゴルーチンが同時に "a" をインクリメントしようとし、そのうちの 1 つがインクリメントして待機します。そのインクリメント関数が戻ると、2 番目の関数が入ってきてインクリメントし、最初の関数の println が実行され、次に 2 番目の関数の println が同じ内容を出力します。

つまり、ミューテックスは期待どおりに機能しますが、ミューテックスによって保護されている領域の外に印刷していることになります。

以上がミューテックスによってロックされている場合にマップ オブジェクトを出力するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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