go 通道并发顺序问题

sucanber 发布于 2018/07/11 13:35
阅读 302
收藏 0
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新手没办法。。)。

加载中
0
小塔罗
小塔罗

如果fibonacci先执行那么他就是一个跳不出来的死锁

返回顶部
顶部