这更像是另一个帖子的后续问题我不明白为什么添加第二个通道(在我的例子中是 c2)会导致死锁。通道是独立的,我不明白为什么 c2 应该被阻止func do_stuff(done chan bool) { fmt.Println("Doing stuff") done <- true}func main() { fmt.Println("Main") done := make(chan bool) go do_stuff(done) <-done //Up tp here everything works c2 := make(chan int) c2 <- 1 fmt.Println("Exit ",<-c2)}
2 回答
倚天杖
TA贡献1828条经验 获得超3个赞
声明
c2 := make(chan int) c2 <- 1
会一直阻塞。
因为通道c2
是无缓冲的,所以在另一个 goroutine 从通道接收到值之前,发送操作无法继续。没有可以从通道接收的 goroutine,因此发送永远阻塞。
Effective Go 中的频道部分是阅读无缓冲频道的好地方。另请参阅Go 语言规范中有关通道和发送的部分。
如果您创建c2
一个缓冲通道,该程序将按我认为的那样工作:
c2 := make(chan int, 1)
通过此更改,发送可以在不与接收器同步的情况下继续进行。
- 2 回答
- 0 关注
- 202 浏览
添加回答
举报
0/150
提交
取消