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 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误