尽量减少在地图上的锁定 - 而是尽快锁定单个项目

  • 本文关键字:锁定 项目 单个 地图 go mutex
  • 更新时间 :
  • 英文 :


我想最大程度地减少可以在检索相关物品后立即锁定的物品地图上锁定的锁。

使我相信

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()并不是一个no-op:

panic: sync: unlock of unlocked mutex

按照https://groups.google.com/forum/# !! topic/golang-nuts/gehbpo6attc,我发现没有办法检查它实际上是Unlock ED。

我应该在某个地方保留"锁"状态,还是有比这更好的方法:

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()
}

最新更新