【问题标题】:Minimize lock held on map — and instead lock on individual item asap尽量减少地图上的锁定 - 而是尽快锁定单个项目
【发布时间】:2017-09-11 05:36:25
【问题描述】:

我想最小化在检索到相关项目后可以单独锁定的项目地图上持有的锁定。

这让我相信

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。

我应该在某处保持“锁定”状态还是有比这更好的方法:

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

【问题讨论】:

    标签: go mutex


    【解决方案1】:
    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()
    }
    

    【讨论】:

    • 谢谢,让我意识到,即使在 rangeing 在地图上找到 needle 的额外情况下,我也可以将它包装在一个函数中并使用相同类型的井,简单,逻辑如上
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    相关资源
    最近更新 更多