在从地图上删除项目之前,我是否要放锁?
package main import ( "errors" "sync" "time" ) type A struct { Error error } func (a *A) Job() { // ... more job } var l sync.RWMutex func 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]A func 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(); delete(值,键); l。解锁;l.RLock(); 在范围内
go l.delete(key)// gorutin飞溅
带锁定/解锁的有效移除方式是哪种?
从映射中删除被视为写操作,并且必须与所有其他读和写序列化。如果我正确地理解了您的问题,那么可以,您需要对删除进行批处理以备后用,或者放弃读锁并采用写锁来完成删除。
运行时将尝试检测并发的读取和写入,并且将因以下之一而崩溃:
fatal error: concurrent map writes fatal error: concurrent map read and map write