在从地图上移除物品之前,我是否需要锁定?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 关注
- 191 浏览
添加回答
举报
0/150
提交
取消
