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