首頁 > 後端開發 > Golang > Go 死鎖:如何避免「所有 goroutine 都在睡眠」錯誤?

Go 死鎖:如何避免「所有 goroutine 都在睡眠」錯誤?

Linda Hamilton
發布: 2024-12-27 13:06:18
原創
835 人瀏覽過

Go Deadlocks: How to Avoid the

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板