在從地圖上移除物品之前,我是否需要鎖定?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
- 1 回答
- 0 關注
- 147 瀏覽
添加回答
舉報
0/150
提交
取消