channel是golang里很重要的一种数据结构
channel的特性

channel内部实现
buffered channel在底层使用一个struct来实现,使用一个环形缓冲区circular queue来保存元素。
向channel发送值
channel的buffer已满

从channel接收值
ps:
使用make来创建channel时,go在堆上分配一个hchan struct,然后初始化它,最后返回的是一个指向hchan struct的指针。
channel发送和接收值的过程
buffered channel之所以能够goruntine安全,因为每次send和receive时,都会对结构体内的mutex上锁。
下面是send的过程。


下面是receive的过程。



channel如何暂停(Pause)和恢复(Resume) goroutine

先了解下Go的调度器和GMP

goroutine可以看做是用户态线程,goroutine由go运行时创建和管理,被调度器调度到系统线程。

暂停(Pause)goroutine

可以看到,当channel满时,被阻塞的只是goroutine,系统线程仍处在运行状态。
恢复(Resume)goroutine


当从一个满的channel接收值时





参考资料
GopherCon 2017: Kavya Joshi - Understanding Channels
Kavya Joshi - Understanding Channels.pdf



学习了|´・ω・)ノ
群主nb,upup|´・ω・)ノ
冲冲冲