首页  >  文章  >  后端开发  >  何时使用sync.Cond与简单锁定:sync.Cond的问题和替代解决方案

何时使用sync.Cond与简单锁定:sync.Cond的问题和替代解决方案

Linda Hamilton
Linda Hamilton原创
2024-11-12 00:16:031028浏览

When to Use sync.Cond vs. Simple Locking: A Problem with sync.Cond and an Alternative Solution

对不正确的sync.Cond使用进行故障排除

初始问题大纲:

尝试使用sync.Cond会导致竞争条件,由于死锁而导致立即恐慌。开发人员怀疑锁定互斥体和调用条件的 Wait 方法之间存在问题。

预期用例的澄清:

除了竞争条件之外,主要目标是创建一个同步机制,多个 goroutine 等待长时间运行的下载 goroutine 中的 HTTP 标头变得可用。

解决方案:

  • 重新评估对sync.Cond的需求:在这种情况下,一个简单的sync.Mutex就足够了,因为只有一个编写器(下载器)和多个读取器(访问标头的goroutine)。
  • 多个读取器和一个写入器的示例:

    var sharedRsc = make(map[string]interface{})
    func main() {
      var wg sync.WaitGroup
      wg.Add(2)
      m := sync.Mutex{}
      c := sync.NewCond(&m)
      go func() {
          c.L.Lock()
          for len(sharedRsc) == 0 {
              c.Wait()
          }
          fmt.Println(sharedRsc["rsc1"])
          c.L.Unlock()
          wg.Done()
      }()
      go func() {
          c.L.Lock()
          for len(sharedRsc) == 0 {
              c.Wait()
          }
          fmt.Println(sharedRsc["rsc2"])
          c.L.Unlock()
          wg.Done()
      }()
      c.L.Lock()
      sharedRsc["rsc1"] = "foo"
      sharedRsc["rsc2"] = "bar"
      c.Broadcast()
      c.L.Unlock()
      wg.Wait()
    }

替代解决方案:

如果使用通道是可行的在这种情况下,它仍然是传递数据的首选方法。

以上是何时使用sync.Cond与简单锁定:sync.Cond的问题和替代解决方案的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn