To為了避免競爭條件,在檢查條件並呼叫 Wait 之前始終取得鎖定至關重要。這確保了 goroutine 在評估條件之前可以獨佔存取共享資料。
選擇正確的同步結構:
m.Lock() for !condition { c.Wait() } // ... m.Unlock()
如果您需要等待來自單一來源的多個資源的可用性,sync.Cond 是一個合適的選擇。但是,如果資料僅在單一讀取器和寫入器之間進行通信,則sync.Mutex可能就足夠了。
替代實作:在您的特定場景中,您需要要等待下載完成並檢索HTTP 標頭,可以使用使用通道的替代實現好:
結論:
// Channel to signal download completion downloadComplete := make(chan bool) // Download goroutine go func() { // Download file and store headers ... close(downloadComplete) }() // Other goroutines go func() { // Wait for download completion <-downloadComplete // Access HTTP headers ... }()
透過正確使用sync.Cond,在檢查條件之前取得鎖,並根據您的需求選擇適當的同步構造,您可以有效地避免競爭條件並確保goroutine 之間的適當協調。
以上是使用sync.Cond時如何避免競爭條件:Go中安全同步指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!