首頁 > 後端開發 > Golang > 當地圖對像被互斥鎖鎖定時列印地圖對象

當地圖對像被互斥鎖鎖定時列印地圖對象

PHPz
發布: 2024-02-10 12:36:09
轉載
859 人瀏覽過

當地圖對像被互斥鎖鎖定時列印地圖對象

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中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板