php小編小新在這裡向大家介紹一個關於互斥鎖的實用技巧:當地圖物件被互斥鎖鎖定時,如何列印地圖物件。互斥鎖是一種用於保護共享資源的機制,確保同時只有一個執行緒可以存取被鎖定的資源。在本文中,我們將探討如何使用互斥鎖來保護地圖對象,並在對像被鎖定時列印出地圖內容,以便更好地理解互斥鎖的使用和地圖對象的存取。
我不確定為什麼互斥體沒有照我的預期工作。任何建議都會對我有幫助。
這是我的程式碼。
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) }
當我運行這個時,我得到了奇怪的輸出。
a map[a:2 b:0] a map[a:2 b:0] b map[a:2 b:1] a map[a:4 b:1] a map[a:4 b:1] b map[a:4 b:2] map[a:4 b:2]
我期望在一些日誌中可以看到 a
增加到 1,2,3,4
當我刪除 inc
函數中的註解時;
我可以看到預期的日誌。
in a map[a:1 b:0] a map[a:1 b:0] in a map[a:2 b:0] a map[a:2 b:0] in b map[a:2 b:1] b map[a:2 b:1] in a map[a:3 b:1] a map[a:3 b:1] in a map[a:4 b:1] a map[a:4 b:1] in b map[a:4 b:2] b map[a:4 b:2] map[a:4 b:2]
在此循環中:
for i := 0; i < n; i++ { c.inc(name) ---> This runs with mutex locked fmt.Println(name, c.counters) --> This runs with mutex unlocked }
println 在互斥鎖之外運作。兩個 goroutine 嘗試同時遞增“a”,其中一個遞增然後等待。當該增量函數返回時,第二個函數進入並遞增,然後第一個函數中的 println 運行,然後第二個函數中的 println 列印相同的內容。
因此,互斥體按預期工作,但您正在互斥體保護的區域之外進行列印。
以上是當地圖對像被互斥鎖鎖定時列印地圖對象的詳細內容。更多資訊請關注PHP中文網其他相關文章!