解决 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中文网其他相关文章!