首頁 >後端開發 >Golang >如何解決Go中Goroutine通訊中的「All Goroutine Are Sleep」死鎖?

如何解決Go中Goroutine通訊中的「All Goroutine Are Sleep」死鎖?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-14 11:20:19338瀏覽

How to Resolve Go's

Go 中的死鎖:理解並解決「所有Goroutines 都處於睡眠狀態」

在提供的Go 程式碼片段中,由於以下原因發生了死鎖對goroutine 通訊的誤解。該程式旨在模擬卡車的裝卸,使用 goroutine 來處理卡車卸載。然而,當加載過程完成時,代碼無法關閉卡車通道(ch),導致死鎖。

要解決此死鎖,關鍵是一旦所有卡車都關閉後,關閉卡車通道(ch)已加載。這向 UnloadTrucks goroutine 發出信號,表明將不再發送卡車,從而允許其返回。

實現此目的的一種方法是使用WaitGroup,如以下程式碼所示:

// Define a WaitGroup to track the completion of the loading goroutines
var wg sync.WaitGroup

// Start goroutines to load trucks
go func() {
    // Load trucks and send them over the truck channel
    for t := range trucks {
        go func(tr Truck) {
            itm := Item{}
            itm.name = "Groceries"

            fmt.Printf("Loading %s\n", tr.name)
            tr.Cargo = append(tr.Cargo, itm)
            ch <- tr

            wg.Done() // Signal the WaitGroup that the loading is complete
        }(trucks[t])
    }
}()

// Use the WaitGroup to wait for all loading goroutines to complete
wg.Wait()

// Close the truck channel after all loading is finished
close(ch)

// Start the UnloadTrucks goroutine
UnloadTrucks(ch)

一旦所有卡車都已裝載,透過關閉卡車通道(ch),UnloadTrucks goroutine 可以終止,從而打破僵局。該程序現在將成功完成,按預期卸載所有卡車。

以上是如何解決Go中Goroutine通訊中的「All Goroutine Are Sleep」死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn