理解Go 中的「拋出:所有Goroutines 都處於睡眠狀態- 死鎖」
在執行簡單的Go 程序時,您可能會遇到錯誤訊息「拋出:所有goroutine 都在睡覺- 僵局!」當所有正在運行的goroutine都在等待從不接收或發送資料的通訊通道時,就會出現此錯誤。要解決這個問題,了解死鎖背後的原因至關重要。
在給定的 Go 程式中,會產生一個 goroutine 來計算三個整數的和。主 goroutine 將這些整數發送到通道並等待結果。然而,由於通道未關閉,goroutine 陷入了無限循環。
為了讓 range 循環在 goroutine 中終止,它需要一個關閉的通道。但由於通道保持開放狀態,循環會無限期地持續下去。這會導致所有 goroutine 等待一個永遠不會發生的事件,從而導致死鎖。
要解決此問題,必須在資料傳輸完成後關閉通道。在程式的修改版本中,引入了第二個通道來回結果。 Total 函數透過這個新通道將整數總和傳回,主 Goroutine 接收來自該通道的結果。另外,原來的通道被關閉,以表示資料傳輸結束。
透過這樣修改程序,goroutine 不再陷入無限循環,從而避免了死鎖。這凸顯了適當關閉通道以避免 Go 程式出現死鎖的重要性。
以上是為什麼我的 Go 程式會拋出'所有 Goroutine 都處於睡眠狀態 - 死鎖”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!