一尘不染

如何实施Go渠道?

go

在简要回顾了Go语言规范,有效的Go和Go内存模型之后,我仍然不清楚Go通道是如何工作的。

它们是什么样的结构?它们的行为有点像线程安全队列/数组。

它们的实现取决于体系结构吗?


阅读 252

收藏
2020-07-02

共1个答案

一尘不染

通道的源文件位于/src/pkg/runtime/chan.go中(从您的源代码根目录开始)。

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

通道操作都是在此chan.go文件中实现的,因此您可以看到makechan,send和receive操作以及select构造,close,len和cap内置函数。

要深入了解通道的内部工作原理,您必须阅读Dmitry
Vyukov亲自撰写的关于类固醇Go通道(Go核心开发人员,goroutines,调度程序和通道等)。

2020-07-02