解決Go Goroutine 中的死鎖
在並發程式設計中,當多個Goroutine 無限期地等待彼此完成操作時,就會發生死鎖,從而有效地停止進程程序。本文解決了Go 並發中遇到的特定死鎖,如原始問題中所述:
<code class="go">package main import ( "fmt" "time" ) func producer(ch chan int, d time.Duration, num int) { for i := 0; i <p>此程式碼由於以下因素觸發死鎖錯誤:</p> <ul> <li>生產者向通道發送值的過程是短暫的,最終會停止產生資料。 </li> <li>主函數中的無限 for 迴圈不斷從通道接收值,沒有終止條件。 </li> <li>無限循環後通道關閉,導致沒有更多的值可用於接收。 </li> </ul> <p><strong>解決方案:協調終止</strong></p> <p>為了避免死鎖,生產者必須協調以發出完成信號,並且通道必須由最後一個生產者關閉。這是使用sync.WaitGroup進行協調的有效解決方案:</p> <pre class="brush:php;toolbar:false"><code class="go">func producer(ch chan int, d time.Duration, num int, wg *sync.WaitGroup) { defer wg.Done() for i := 0; i <p>在此解決方案中:</p> <ul> <li>我們為每個生產者增加WaitGroup。 </li> <li>每個生產者透過 defer 語句在完成後遞減 WaitGroup。 </li> <li>goroutine 等待 WaitGroup 達到零(意味著所有生產者都完成)並關閉通道。 </li> <li>主循環使用 for range構造以在關閉之前迭代通道上發送的值。 </li> </ul></code>
以上是當生產者壽命較短時,如何避免 Go Goroutine 死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!