使用通道死锁进行例行公事



我刚开始学习围棋,所以请耐心等待,我尝试过使用 Go 例程和通道,但不知何故陷入僵局。

下面是示例

package main
import (
"fmt"
"sync"
)

func main() {
total := 2
var wg sync.WaitGroup
wg.Add(total)
ch := make(chan int)
for idx := 0; idx < total; idx++ {
fmt.Printf("Processing idx %dn", idx)
go func(idx int) {
defer wg.Done()
ch <- idx
}(idx)
}
for val := range ch {
fmt.Println(val)
}
fmt.Println("Wait")
wg.Wait()
}

引发错误

Processing idx 0
Processing idx 1
1
0
fatal error: all goroutines are asleep - deadlock!
range ch

从通道读取,直到通道关闭。

你给close(ch)打了多少次电话?for val := range ch循环何时终止?


什么时候应该关闭频道? 你在这里有很多选择,但一种方法是添加另一个goroutine:

go func() {
wg.Wait()
close(ch)
}()

例如,在剥离所有将写入通道然后调用wg.Done()的例程之后,一旦所有写入器完成写入,通道就会关闭。 (您可以在增加wg计数以考虑所有编写器后立即运行此 goroutine。

最新更新