首頁  >  文章  >  後端開發  >  為什麼在 Go 頻道中按值傳遞 WaitGroup 會導致死鎖?

為什麼在 Go 頻道中按值傳遞 WaitGroup 會導致死鎖?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-31 04:59:02375瀏覽

Why does passing a WaitGroup by value in Go channels lead to a deadlock?

Go Channel 由於引用傳遞而出現死鎖

在Go 中,通道是一種強大的通訊機制,但如果不這樣做,可能會導致死鎖正確使用。當兩個或多個 goroutine 互相等待對方完成操作,導致兩個 goroutine 都無法繼續執行時,就會發生死鎖。

考慮以下Go 程序:

<br>包主<p>導入(</p><p>)</p><p>func push(c chan int, wgsync.WaitGroup) {</p><p>}</p><p>func pull(c chan int, wg 同步.WaitGroup) {</p><p> </p><p>func main() {</p><p>}<br></p>

當你執行這個程序,它會因死鎖錯誤而恐慌:

問題關鍵在於WaitGroup 如何傳遞給goroutine。在 Go 中,結構體是按值傳遞的,這意味著 WaitGroup 的副本會傳遞給每個 goroutine。當一個 goroutine 在副本上呼叫 Done 時,它對在 main 函數中建立的原始 WaitGroup 沒有影響。

要修復死鎖,必須傳遞 WaitGroup 指標而不是值。這是修正後的程式碼:

<br>package main<p>import (</p><p>)</p><p>func push(c chan int , wg *sync.WaitGroup) {</p><p>}</p><p>func pull(c chan int, wg *sync.WaitGroup) {</p><p> 🎜></p>func main( ) {<p></p>}<p></p>

透過傳遞WaitGroup 指標而不是值,兩個goroutine 都可以存取同一個同一個實例。當一個 goroutine 呼叫 Done 時,它會減少原始 WaitGroup 上的計數,從而允許另一個 goroutine 繼續執行。

以上是為什麼在 Go 頻道中按值傳遞 WaitGroup 會導致死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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