GoLang 中的死鎖:為什麼要在緩衝通道上進行範圍?
在 GoLang 中使用緩衝通道時,避免造成死鎖情況非常重要。最近的一個問題引起了人們的擔憂,即在所有 goroutine 完成後嘗試在緩衝通道上進行範圍操作時遇到死鎖。
提供的程式碼嘗試使用容量為 4 的緩衝通道並產生 4 個發送資料的 goroutine到頻道。然而,死鎖的原因是:
解決方案1:擴展通道大小並在完成後關閉
要解決死鎖,通道可以增加大小並在所有goroutine 完成後關閉:
ch := make(chan []int, 5)
...
wg.Wait()
close(ch)
但是,這消除了管線的好處,因為它會阻止列印,直到所有任務完成。
解決方案2:從列印例程中發出訊號完成
要啟用實際的管線操作,可以在列印例程中呼叫Done() 函數:
func main() {
ch := make(chan []int, 4)
...
go func() {
for c := range ch {
fmt.Printf("c is %v\n", c)
wg.Done()
}
}()
...
}
這種方法確保僅在列印每個元素後調用 Done() 函數,有效地表示每個 goroutine 的完成。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3