go - 最大限度地减少 map 上的锁定 - 而是尽快锁定单个项目

标签 go mutex

我希望最大限度地减少项目 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()

…但据我了解,在已经Unlocked上的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/

相关文章:

postgresql - Go GORM many2many问题

multithreading - 关于 Goroutines 的 Golang 内存泄漏

c - 一旦我们发出了条件变量的信号,我们会继续执行原始线程吗?

c - 使用线程从链表中删除元素

c++ - 使用屏障同步生产者/消费者

c++ - 互斥映射数据结构

go - 了解不同系统上的tz偏移差异

go - SSH 脚本使用 pty 和 io.Copy 通过菜单流式输出

unit-testing - 比较嵌套 slice 而忽略顺序

c - 如何强制一个线程在另一个线程之前启动?