Go 在并发环境中从映射中删除是否安全?在戈兰
在从地图中移除项目之前,我是否已锁定Go 在并发环境中从映射中删除是否安全?在戈兰,go,Go,在从地图中移除项目之前,我是否已锁定 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()
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)
}
}
变体:
哪种变体可以通过锁定/解锁进行有效删除?从映射中删除被视为写入操作,并且必须与所有其他读取和写入一起序列化。如果我正确理解了您的问题,那么是的,您需要批处理删除以供以后使用,或者放弃读锁并使用写锁来完成删除 运行时尝试检测并发读写,并将因以下情况之一而崩溃:
fatal error: concurrent map writes
fatal error: concurrent map read and map write
“竞争环境”=“并行环境”?“Die Konkurrenz”在德语中的意思是“竞争”(与并发无关),所以我想知道它在其他语言中是否也会混淆。并发:)我从俄语翻译成英语时已经是深夜:)俄语变体问题:我想了解如何以最合理的方式移除对象并避免不必要的锁定。错误对象的GC:)