天天看点

go channel源码

今天在【Go夜读#Channel】的视频,感觉这个视频很长,两个小时,然后比较模糊,听不明白,可能是自己读源码的基础不够吧。不过前面的可视化版本还是不错的

把hchan的属性可视化到下面这种,看起来就很好理解

go channel源码

后面读源码的第二部分就看得云里雾里了,只好去网上找其他博客来看,下面这篇还不错

http://legendtkl.com/2017/08/06/golang-channel-implement/

大概总结一下:

go channel源码

1、创建channel的时候,要注意的就是如果是  chan(interface{},4) 这种有buffer的channel 的话,那4个channle是一次性申请空间的,好像上面那篇博客讲的时候,还是go1.9,那个时候还是分开申请的,现在已经连续申请了

2、如果是写入的话

      先看接受队列有没有人等,如果有,先给接受队列里面的(直接跳过往buffer里面放数据)

      如果没有,再看buffer里面是否还可以放得下,如果放得下就放下

      如果buffer里面放不下,就阻塞

3、如果是读取的话,就跟写入是相反的

     先看生产队列有没有人生产好了,如果有,直接读取这个(跳过buffer)

     如果没有,再看buffer里面是否有,读取

     如果buffer里面也没有,阻塞

4、关闭channel的话,注意的点就是要唤醒生产队列和消费队列里面的阻塞groutine

      直接把两个队列全部放到临时队列(gList)中,然后马上释放锁(因为持有锁的代价昂贵),然后再唤醒gList里面的groutine