Go 中的死鎖:「拋出:所有goroutine 都在睡覺」
當所有正在運行的goroutine 互相等待時,就會發生goroutine 死鎖完全的。在提供的 Go 代碼中,由於 ch 通道未關閉,導致出現死鎖。
total 函數使用範圍循環不斷等待 ch 通道上的新值。由於 ch 通道永遠不會關閉,因此循環永遠不會終止。這意味著負責執行該函數的 goroutine 永遠不會完成。
同時,在 main 函數中,程式嘗試將值傳送到 ch 通道並接收結果。但是,由於總 goroutine 無限期地等待,因此它無法處理發送的值並發回結果。這會導致程式死鎖。
要解決此死鎖,必須在發送所有值後關閉 ch 通道。這將向 Total 函數發出訊號,停止等待新值並計算結果。
這是帶有通道關閉的程式碼的修改版本:
package main import ( "fmt" ) func total(in chan int, out chan int) { res := 0 for iter := range in { res += iter } out <- res // sends back the result } func main() { ch := make(chan int) rch := make(chan int) go total(ch, rch) ch <- 1 ch <- 2 ch <- 3 close(ch) // this will end the loop in the total function result := <-rch // waits for total to give the result fmt.Println("Total is ", result) }
現在,goroutine 正在運行 Total將正確執行求和並將結果發送回 main,防止死鎖。
以上是Go 死鎖:如何避免「所有 goroutine 都在睡眠」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!