以前看过channel的代码,有点印象,就抽样的尝试回答一下。

channel有个很重要的sutrct,hchan! hchan里面有个 mutex lock,数组模拟的fifo队列,生产者游标,消费者游标,生产者等待队列,消费者等待队列等。。。


看完这些数据结构有点想法了吧? 当我生产者可以push数据之后,我会顺带把消费者等待队列的某个g给激活,如果我push被阻塞了,那么我自然就存在于等待唤醒的生产者队列。 谁来唤醒? 当然是某个消费者...


简单说,是有mutex锁的,但不会引起协程绑定的线程的上下文切换,只是在go runtime里调度了Goroutine而已。。。