一尘不染

Go 通道是如何实现的?

go

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

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

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


阅读 202

收藏
2021-12-16

共1个答案

一尘不染

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

hchan是通道的中心数据结构,带有发送和接收链表(持有指向它们的 goroutine 和数据元素的指针)和一个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、调度程序和通道等)。

2021-12-16