我有幾個關(guān)于 Gosync.Mutex與struct. 例如,如果我有這個struct:type something struct { aMux sync.Mutex a map[string]interface{} bMux sync.Mutex b int}...在沒有競爭條件的情況下同時鎖定和訪問時鎖定和訪問是否安全?bMuxbaMuxa知道我正在訪問指向結(jié)構(gòu)的指針,并使用這樣的方法同時鎖定/解鎖互斥量可能也很有幫助:func (s *something) addA(k string, v interface{}) { (*s).aMux.Lock() (*s).a[k] = v (*s).aMux.Unlock()}func (s *something) addB(k string, v interface{}) { (*s).bMux.Lock() (*s).b++ (*s).bMux.Unlock()}我的假設(shè)是這在理論上應(yīng)該是安全的,因為您已經(jīng)可以在結(jié)構(gòu)中鎖定互斥量而不必訪問它鎖定的字段。但是當(dāng)struct像上面這樣取消引用時,Go 是否復(fù)制了所有值struct(使其不安全),或者它是否只修改/檢索您指定的字段?我非常希望將互斥量保持在同一個結(jié)構(gòu)中,因為在我的代碼中,我在同一個結(jié)構(gòu)中有多個(最多六個)相關(guān)字段,我用互斥量分別鎖定。如果在同一個結(jié)構(gòu)(對于相關(guān)字段)中有多個互斥體是安全的,但不推薦或不好的做法,為什么?什么是更好的結(jié)構(gòu)?
2 回答

哈士奇WWW
TA貢獻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)。一旦你進行了非常細粒度的鎖定,你就必須非常小心,我會先探索其他選擇。

九州編程
TA貢獻1785條經(jīng)驗 獲得超4個贊
是的,你的結(jié)構(gòu)中可以有多個互斥體
不要使事情過于復(fù)雜:您可以使用單個互斥鎖來保護對結(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)注
- 129 瀏覽
添加回答
舉報
0/150
提交
取消