尽量减少对地图的锁定——尽快锁定单个项目

Minimize lock held on map — and instead lock on individual item asap

我想最小化项目地图上的锁,一旦检索到相关项目就可以单独锁定。

这让我相信

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() 已经 Unlocked 不是空操作:

panic: sync: unlock of unlocked mutex

根据 https://groups.google.com/forum/#!topic/Golang-Nuts/GeHbpo6AtTc 我看到没有办法检查它是否真的 Unlocked。

我应该只在某处保持 "Lock" 状态还是有比这更好的方法:

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