golang 中互斥锁到底锁什么?

问题描述 投票:0回答:1

在下面的代码中,我如何区分 gloabllock 和 entrylock 以及它到底锁定什么

type cacheImpl struct {
    globalLock       sync.Mutex
    EntryLock map[string]*sync.Mutex
        
    abc map[string]int
}

我希望entrylock只锁定与该key对应的一个int条目。但这个参考是如何创建的。

go locking mutex
1个回答
0
投票

我想说你对此的思考方式是有缺陷的:互斥锁本身不会锁定任何其他东西。通过扩展,当我们说特定的互斥锁保护某个特定的变量(或一组变量)时,我们暗示这种情况发生在凭借所有可能的代码路径访问该变量(或该集合)一致地使用该互斥体。

换句话说,互斥体本身只是一个同步原语,它实现了调用其

Lock

 方法的特定规则:只要互斥体被锁定,对其 
Lock
 方法的任何调用都会挂起调用 Goroutine,直到互斥体被锁定。解锁,之后每个当前挂起的调用 goroutine 都会醒来并“重试”锁定互斥体,只有其中一个成功。

因此,要使互斥锁有用,您必须将其与您自己实现的特定工作流程结合起来。

我不太清楚你的问题,但如果你打算在

EntryLock

中创建互斥体来管理对
abc
中相同键条目的访问,那么你可以像这样滚动:

  • 添加新条目时:

      锁定
    1. globalLock
    2. abc
       添加条目;
    3. EntryLock
       添加条目 – 这可能看起来就像 
      EntryLock[theKey] = new(sync.Mutex)
      ;
    4. 解锁
    5. globalLock
  • 使用条目时:

      锁定
    1. globalLock
    2. 锁定
    3. EntryLock[theKey
      ];
    4. 搞乱
    5. abc[theKey]
    6. 解锁
    7. EntryLock[theKey]
      ;
    8. 解锁
    9. globalLock
  • 删除条目是指在按住

    globalLock

     的同时从两个地图中删除项目。

请注意,即使您想锁定单个

globalLock 条目,您也必须

按住 
abc
。
如果你同意某些 Goroutine 同时从地图中删除“锁定的条目”,你可以这样做

    锁定
  1. globalLock
  2. 锁定
  3. EntryLock[theKey
    ];
  4. 解锁
  5. globalLock
    请注意,现在任何其他 goroutine 都可能会在您使用
    abc[theKey]
    EntryLock[theKey]
     时删除它们;
  6. 搞乱
  7. abc[theKey]
  8. 解锁
  9. EntryLock[theKey]
    ;
© www.soinside.com 2019 - 2024. All rights reserved.