回答

收藏

Go 通道是如何实现的?

技术问答 技术问答 208 人阅读 | 0 人回复 | 2023-09-12

回顾  Go Go 和 Go 内存模型之后,我还是有点不清楚 Go 通道是如何在幕后工作的。
; P. A0 J) s" T9 F+ Z它们的结构是什么?它们的行为有点像线程安全队列/数组。
# w% h1 E( H4 A2 ]2 k" h% i它们的实现取决于结构吗?; |: R3 C- h3 W  m% l( G; B
                                                               
. o8 v( Y' A' b9 [    解决方案:                                                               
0 B7 I8 u- j* s0 B  E                                                                源文件(来自你的 go 源代码根src/pkg/runtime/chan.go 中。
0 w4 y! n9 X* F' G. }hchan它是带有发送和接收链表的通道中心数据结构(持有指向它们的 goroutine 和数据元素的指针)和一个closed标志。有一个Lock在 runtime2.go 中定义的嵌入式结构,根据操作系统作为互斥锁 (futex) 或信号量。在 实现锁定lock_futex.go (Linux/Dragonfly/Some BSD) 或 lock_sema.go (Windows/OSX/Plan9/Some BSD) 中,基于标签的构建。- ]  f/ S7 O6 h# q/ s1 a
通道操作都在这个chan.go所以你可以在文件中看到它makechan、send和receive操作,以及select构造、close、len和cap内置。/ U: @6 N! ^0 Q; |- g$ _2 r
要深入了解渠道的内部工作原理,必须阅读Dmitry Vyukov 我写的Go 通道(Go 核心开发人员,goroutines、调度程序、通道等。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则