亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

在并發環境中從地圖中刪除是否安全?在 Golang

在并發環境中從地圖中刪除是否安全?在 Golang

Go
夢里花落0921 2022-01-04 21:14:16
在從地圖上移除物品之前,我是否需要鎖定?package mainimport (     "errors"    "sync"    "time")type A struct {    Error error}func (a *A) Job() {//    ... more job}var l sync.RWMutexfunc generate() {    l.Lock()    values["key1"] = A{}    l.Unlock()    l.Lock()    values["key2"] = A{}    values["key3"] = A{}    l.Unlock() //   ...    l.Lock()    values["key1919"] = A{Error: errors.New("oh...")}    l.Unlock() //   ...    l.Lock()    values["key99999999999"] = A{}    l.Unlock()}var values map[string]Afunc main() {    values = make(map[string]A)    go generate()    for {        l.RLock()        for key, value := range values {            if value.Error != nil {                delete(values, key)    // it's safe? or you need to take a lock?            } else {                value.Job()            }           }        l.RUnlock()        time.Sleep(10 * time.Second)    }}變體:刪除范圍內不用擔心在切片和單獨的范圍中添加鍵以刪除它們l.RUnlock(); l.Lock(); 刪除(值,鍵);l.解鎖;l.RLock(); 在范圍內go l.delete(key) // gorutin 飛濺哪種變體是鎖定/解鎖的有效移除?
查看完整描述

1 回答

?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

從映射中刪除被視為寫入操作,并且必須與所有其他讀取和寫入進行序列化。如果我正確理解您的問題,那么是的,您需要批量刪除以備后用,或者放棄讀鎖并獲取寫鎖以完成刪除。


運行時會嘗試檢測并發讀取和寫入,并且會因以下情況之一而崩潰:


fatal error: concurrent map writes

fatal error: concurrent map read and map write


查看完整回答
反對 回復 2022-01-04
  • 1 回答
  • 0 關注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號