第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

同一結(jié)構(gòu)中的多個互斥量?

同一結(jié)構(gòu)中的多個互斥量?

Go
胡說叔叔 2023-06-05 19:25:11
我有幾個關(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貢獻(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ì)粒度的鎖定,你就必須非常小心,我會先探索其他選擇。


查看完整回答
反對 回復(fù) 2023-06-05
?
九州編程

TA貢獻(xiàn)1785條經(jīng)驗 獲得超4個贊

  • 是的,你的結(jié)構(gòu)中可以有多個互斥體

  • 不要使事情過于復(fù)雜:您可以使用單個互斥鎖來保護(hù)對結(jié)構(gòu)中兩個元素中任何一個的訪問,即任何修改您的操作mapint可以共享同一個互斥鎖的操作

  • 從其他函數(shù)引用您的結(jié)構(gòu)時 - 使用像您的方法一樣的指針 - 確保不復(fù)制該結(jié)構(gòu)。復(fù)制的結(jié)構(gòu) - 帶有互斥量 - 將導(dǎo)致不可預(yù)測/不安全的結(jié)果

來自 golang?mutex 文檔:

不應(yīng)復(fù)制包含此包中定義的類型(即 sync.Mutux)的值。


查看完整回答
反對 回復(fù) 2023-06-05
  • 2 回答
  • 0 關(guān)注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號