初始問題大綱:
嘗試使用sync.Cond會導致競爭條件,由於死鎖而導致立即恐慌。開發人員懷疑鎖定互斥體和呼叫條件的 Wait 方法之間存在問題。
預期用例的澄清:
除了競爭條件之外,主要目標是創建一個同步機制,其中多個goroutine 等待HTTP 標頭從長時間運行的下載中變得可用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中文網其他相關文章!