go channel源码

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

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

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

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

大概总结一下:

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值