GoLang 中的死鎖:為什麼要在緩衝通道上進行 Range?
在 GoLang 中使用緩衝通道時,避免造成死鎖情況非常重要。最近的一個問題引起了人們對在所有 goroutine 完成後嘗試在緩衝通道上進行範圍操作時遇到死鎖的擔憂。
提供的程式碼嘗試使用容量為 4 的緩衝通道並產生 4 個發送資料的 goroutine到頻道。然而,死鎖的原因是:
解決方案1:擴展通道大小並在完成後關閉
要解決死鎖,通道可以增加大小並在所有goroutine 完成後關閉:
<code class="go">ch := make(chan []int, 5) ... wg.Wait() close(ch)</code>
但是,這消除了管道的好處,因為它會阻止列印,直到所有任務完成。
解決方案2:從列印程式發出完成訊號
要啟用實際的管線,可以在列印程式中呼叫Done() 函數:
<code class="go">func main() { ch := make(chan []int, 4) ... go func() { for c := range ch { fmt.Printf("c is %v\n", c) wg.Done() } }() ... }</code>
此方法可確保Done() 函數僅在每個元素被列印後調用,有效地表示每個goroutine 的完成。
以上是在 GoLang 中對緩衝通道進行測距時如何避免死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!