解決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 < num; i++ { ch <- i time.Sleep(d) } } func main() { ch := make(chan int) go producer(ch, 100*time.Millisecond, 2) go producer(ch, 200*time.Millisecond, 5) for { fmt.Println(<-ch) } close(ch) }</code>
此程式碼由於以下因素觸發死鎖錯誤:
解決方案:協調終止
為了避免死鎖,生產者必須協調以發出完成信號,並且通道必須由最後一個生產者關閉。這是使用sync.WaitGroup進行協調的有效解決方案:
<code class="go">func producer(ch chan int, d time.Duration, num int, wg *sync.WaitGroup) { defer wg.Done() for i := 0; i < num; i++ { ch <- i time.Sleep(d) } } func main() { wg := &sync.WaitGroup{} ch := make(chan int) wg.Add(1) go producer(ch, 100*time.Millisecond, 2, wg) wg.Add(1) go producer(ch, 200*time.Millisecond, 5, wg) go func() { wg.Wait() close(ch) }() for v := range ch { fmt.Println(v) } }</code>
在此解決方案中:
以上是當生產者壽命較短時,如何避免 Go Goroutine 死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!