示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
func main() { c := make(chan int , 1) go func() { // 消费者 <-c }() go func() { // 如果没有这个协程,就得报deadlock而终止程序 i := 0 for { i++ } }() c <- 1 c <- 1 c <- 1 } |
如上程序:
如果没有第二个go协程,那么第一个协程是消费者,main协程是生产者,消费者死去后,就会出现deadlock错误; 原以为是runtime检测到我们在写一个没人消费的chan感到奇怪而报错,实际上不是的,甚至也不是写不进去而报错,而是,没有一个协程是能被执行的了(就好比陈佩斯的小偷中说的那样,这大半夜的也每个车让我指挥指挥),所以,runtime才感觉很迷茫,就报了个deadlock; 如果有第二个协程在的话,runtime会很高兴地去执行第二个协程的,真的不在意那个chan是否有人消费的。