在(简单地)回顾了围棋语言规范、有效围棋和围棋记忆模型之后,我仍然有点不清楚围棋频道是如何在幕后工作的.
它们是什么样的 struct ?它们的行为有点像线程安全的队列/array.
它们的实现是否取决于体系 struct ?
在(简单地)回顾了围棋语言规范、有效围棋和围棋记忆模型之后,我仍然有点不清楚围棋频道是如何在幕后工作的.
它们是什么样的 struct ?它们的行为有点像线程安全的队列/array.
它们的实现是否取决于体系 struct ?
通道的源文件是(从GO源代码根目录)/src/pkg/runtime/chan.go.
hchan
是通道的中心数据 struct ,具有发送和接收链表(持有指向它们的goroutine和数据元素的指针)和closed
标志.在runtime2.go中定义了一个Lock
嵌入式 struct ,它根据操作系统充当互斥(Futex)或信号量.根据构建标记,锁定实现位于lock_futex.go(Linux/Dragonfly/ome BSD)或lock_sema.go(Windows/osx/Plan9/ome BSD)中.
渠道运营都是在这个渠道中实施的.go文件,这样您就可以看到makechan、发送和接收操作,以及select construct、close、len和cap内置程序.
要深入了解通道的内部工作原理,您必须阅读Dmitry Vyukov本人的Go channels on steroids篇文章(请参阅core dev、goroutines、调度器和通道等内容).