初始问题大纲:
尝试使用sync.Cond会导致竞争条件,由于死锁而导致立即恐慌。开发人员怀疑锁定互斥体和调用条件的 Wait 方法之间存在问题。
预期用例的澄清:
除了竞争条件之外,主要目标是创建一个同步机制,多个 goroutine 等待长时间运行的下载 goroutine 中的 HTTP 标头变得可用。
解决方案:
多个读取器和一个写入器的示例:
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中文网其他相关文章!