关于channel的问题

来源:6-1 channel

寻曜

2021-05-14 15:14:33

老师您好,有几个问题想请教一下

1、http://img.mukewang.com/climg/609e22650982652b15220820.jpg

这样执行为什么会报错呢,不是先在channel里面放数据,然后协程在读出来吗


2、http://img.mukewang.com/climg/609e230d09d333c716720883.jpg

printf是并发打印吗,那为什么这样输出是有序的呢?

写回答

1回答

ccmouse

2021-05-15

第一个。往channel放数据的时候必须有人收,不然会在放数据这行阻塞。运行到19行

​channels[i]<-'a'+i

的时候,后面的go readChannel还没有运行到,所以没有人收,造成死锁,也就是它报的这个错误。


第二个。好的那我们调整了顺序,先go readChannel。这里的并发,不是因为printf是并发的,而是goroutine是并发的。这里我们看到时顺序打印的,但是理论上不能保证。我们要比开启一个goroutine和print,谁先被调度。事实上我们观测到的都是顺序执行,说明在这几次观测中,print比开启goroutine先调度。但go语言并不保证这一点。并发的代码运行,多种结果都是可能的。


0

0 学习 · 1399 问题

查看课程