我正在学习围棋。我正在尝试使用信号量解决 goroutine 上的死锁问题。我创建了两个写入无缓冲通道的函数。阅读正在主频道上进行。第三个功能应该关闭通道。当我运行程序时,它会抛出这个错误致命错误:所有goroutines都睡着了 - 死锁!有人可以向我解释为什么这不起作用。
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
var s = []string{"a", "b", "c", "d"}
var w = []string{"w", "x", "t", "z", "p"}
func f(c chan string, ch chan bool) {
for _, word := range s {
c <- word
}
fmt.Println("f about to exit")
ch <- true
wg.Done()
}
func g(c chan string, ch chan bool) {
for _, word := range w {
c <- word
}
fmt.Println("g about to exit")
ch <- true
wg.Done()
}
func f1(ch chan string, c chan bool) {
<-c
<-c
fmt.Println("about to close channel")
close(ch)
}
func main() {
ch := make(chan string)
c := make(chan bool)
wg.Add(3)
go f(ch, c)
go g(ch, c)
go f1(ch, c)
for word := range ch {
fmt.Println(word)
}
wg.Wait()
}
www说
一只萌萌小番薯
相关分类