开发者社区> 问答> 正文

go 通道并发顺序问题?报错

有如下go 代码片段:

package main

import "fmt"

func fibonacci(c, quit chan int) {
	x, y := 0, 1
	// 不断向c中发送数据,直到quit接到退出信号
	for {
		select {
		case c <- x:
			x, y = y, x+y
		case <-quit:
			fmt.Println("quit")
			return
		}
	}
}

func main() {
	c := make(chan int)
	quit := make(chan int)
    // 位置 1
	go func() {
		// 从通道c读取10个数值
		for i := 0; i < 10; i++ {
			fmt.Println(<-c)
		}
		// 然后向quit发送退出信号
		quit <- 0
	}()
    // 位置2
	fibonacci(c, quit)

}

1. 改代码能正常执行,但是如果我把最后一行提到位置1(即放到go func匿名函数之前)就报错,为什么:

fatal error: all goroutines are asleep - deadlock!

2. 能否用通俗的语言详细解释一下具体代码执行流程(golang新手没办法。。)。

展开
收起
爱吃鱼的程序员 2020-06-06 16:54:08 557 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        <p>如果fibonacci先执行那么他就是一个跳不出来的死锁</p>
    
                    
    
                        <p>如果 先执行fibonacci ,那么main 协程就会等待case条件:1,有读取c 2,有写入quit,此时这都没有发生,那么main协程锁住,不会向下执行 go func() 那个匿名函数了, 整体死锁 </p>
    
    2020-06-06 16:54:20
    赞同 展开评论 打赏
问答分类:
Go
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Go语言路上踩过的坑 立即下载
gohbase :HBase go客户端 立即下载
Go构建日请求千亿级微服务实践 立即下载