我希望最大限度地减少项目 map 上的锁定,一旦检索到相关项目,这些项目就可以单独锁定。
这让我相信
var Mymap struct {
sync.Mutex
m map[string]*Somestruct
}
type Somestruct struct {
sync.Mutex
Someval string
}
可以这样使用:
Mymap.Lock()
if val, ok := Mymap.m.[needle]; ok {
Mymap.m.[needle].Lock()
Mymap.Unlock()
// do something to this entry
Mymap.m.[needle].Unlock()
}
Mymap.Unlock()
…但据我了解,在已经Unlock
ed上的Unlock()
并不是一个空操作:
panic: sync: unlock of unlocked mutex
根据https://groups.google.com/forum/#!topic/Golang-Nuts/GeHbpo6AtTc我发现无法检查它是否确实已解锁
。
我应该将“锁定”状态保留在某个地方还是有比这更好的方法:
var unlocked bool
Mymap.Lock()
if val, ok := Mymap.m.[needle]; ok {
Mymap.m.[needle].Lock()
Mymap.Unlock()
unlocked := true
// do something to this entry
Mymap.m.[needle].Unlock()
}
if !unlocked {
Mymap.Unlock()
}
最佳答案
Mymap.Lock()
if val, ok := Mymap.m.[needle]; ok {
Mymap.m.[needle].Lock()
Mymap.Unlock()
// do something to this entry
Mymap.m.[needle].Unlock()
} else {
Mymap.Unlock()
}
关于go - 最大限度地减少 map 上的锁定 - 而是尽快锁定单个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46145728/