2 回答

TA貢獻(xiàn)1799條經(jīng)驗 獲得超6個贊
在單個結(jié)構(gòu)中擁有多個互斥體應(yīng)該是安全的。請注意不要按值傳遞結(jié)構(gòu),因為互斥鎖不是引用類型并且復(fù)制它們是錯誤的。
您不需要顯式取消引用,Go 會為您完成:
func?(s?*something)?addA(k?string,?v?interface{})?{ ????s.aMux.Lock() ????s.a[k]?=?v ????s.aMux.Unlock() }
應(yīng)該也能正常工作(在Go tour中)。
我會說這不是很常見的設(shè)計。如果可能的話,我更喜歡互斥鎖來鎖定整個結(jié)構(gòu)。一旦你進(jìn)行了非常細(xì)粒度的鎖定,你就必須非常小心,我會先探索其他選擇。

TA貢獻(xiàn)1785條經(jīng)驗 獲得超4個贊
是的,你的結(jié)構(gòu)中可以有多個互斥體
不要使事情過于復(fù)雜:您可以使用單個互斥鎖來保護(hù)對結(jié)構(gòu)中兩個元素中任何一個的訪問,即任何修改您的操作
map
或int
可以共享同一個互斥鎖的操作從其他函數(shù)引用您的結(jié)構(gòu)時 - 使用像您的方法一樣的指針 - 確保不復(fù)制該結(jié)構(gòu)。復(fù)制的結(jié)構(gòu) - 帶有互斥量 - 將導(dǎo)致不可預(yù)測/不安全的結(jié)果
來自 golang?mutex 文檔:
不應(yīng)復(fù)制包含此包中定義的類型(即 sync.Mutux)的值。
- 2 回答
- 0 關(guān)注
- 121 瀏覽
添加回答
舉報