首页 > 后端开发 > Golang > 正文

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

Linda Hamilton
发布: 2024-11-12 00:16:03
原创
991 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板