2013-10-27 47 views
40

经过(简要地)回顾了Go语言规范,有效的Go和Go记忆模型之后,我仍然不清楚Go渠道如何在隐藏模式下工作。Go通道如何实现?

它们是什么样的结构?它们的行为类似于线程安全的队列/数组。

它们的实现是否依赖于架构?

回答

56

频道的源文件是/src/pkg/runtime/chan.go中的源代码(来自你的源代码根目录)。

hchan是通道的中央数据结构,包含发送和接收链接列表(持有指向其goroutine和数据元素的指针)和closed标志。在runtime2.go中定义了一个Lock嵌入式结构,根据操作系统的不同,它可用作互斥锁(futex)或信号量。基于构建标签,锁定实现位于lock_futex.go(Linux/Dragonfly /某些BSD)或lock_sema.go(Windows/OSX/Plan9 /某些BSD)中。

通道操作都在这个chan.go文件中实现,因此您可以看到makechan,发送和接收操作,以及select构造,close,len和cap内置。

想要深入了解渠道的内部工作原理,您必须阅读Dmitry Vyukov本人(Go core dev,goroutines,scheduler和channels等)的Go channels on steroids