douchen7555 2017-09-10 21:27
浏览 24
已采纳

最小化地图上的锁定-而是尽快锁定单个项目

I want to minimize the lock held on a map of items that can be individually locked as soon as the relevant item has been retrieved.

That lead me to believe that

var Mymap struct {
    sync.Mutex
    m map[string]*Somestruct
}

type Somestruct struct {
    sync.Mutex
    Someval string
}

could be used like this:

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

…but as I understand Unlock() on an already Unlocked is not a no-op:

panic: sync: unlock of unlocked mutex

As per https://groups.google.com/forum/#!topic/Golang-Nuts/GeHbpo6AtTc I see that there is no way to check that it is actually Unlocked.

Should I just keep the "Lock" state somewhere or is there a better way of doing it than this:

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()
}
  • 写回答

1条回答 默认 最新

  • douwanc63652 2017-09-10 21:36
    关注
    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()
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路
  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 如何绘制动力学系统的相图