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