golang-notes icon indicating copy to clipboard operation
golang-notes copied to clipboard

期待解决select如何释放等待的channel的

Open zdyj3170101136 opened this issue 5 years ago • 1 comments

select的源码中在被唤醒后,会把在其他channel上等待的都删除。

但是这有一个问题,就是channel如何识别这是第一个select,以及如何在唤醒第一个select后其他的channel碰到此select的不会去唤醒他?

详情可看chan源码,我也在解决这个问题,可惜还是有疑惑

zdyj3170101136 avatar Nov 08 '19 11:11 zdyj3170101136

当有多个 channel ready时,多个 channel 的等待队列在将 g 出队时,会判断该 g 是否通过 select 入队的,如果是,检查 spg.g.selectDone 是否标记为1了,如果是就会跳过,否则就唤醒,对应的代码是 runtime/chan.go: func (q *waitq) dequeue() *sudog {}

yangxikun avatar Nov 09 '19 12:11 yangxikun