CSP模型
要想理解 channel 要先知道 CSP 模型。CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,由 Tony Hoare 于 1977 年提出。简单来说,CSP 模型由并发执行的实体(线程或者进程)所组成,实体之间通过发送消息进行通信,这里发送消息时使用的就是通道,或者叫 channel。CSP 模型的关键是关注 channel,而不关注发送消息的实体。Go 语言实现了 CSP 部分理论,goroutine 对应 CSP 中并发执行的实体,channel 也就对应着 CSP 中的 channel。
channel分类
channel 分为无缓冲 channel 和有缓冲 channel。两者的区别如下:
无缓冲:发送和接收动作是同时发生的。如果没有 goroutine 读取 channel (<- channel),则发送者 (channel <-) 会一直阻塞。

有缓冲:缓冲 channel 类似一个有容量的队列。当队列满的时候发送者会阻塞;当队列空的时候接收者会阻塞。

channel的底层实现
Go语言channel是first-class的,意味着它可以被存储到变量中,可以作为参数传递给函数,也可以作为函数的返回值返回。作为Go语言的核心特征之一,虽然channel看上去很高端,但是其实channel仅仅就是一个数据结构而已,结构体定义如下:
type hchan struct {
qcount uint // 队列q中总的数据量(容量)
dataqsiz uint //环形队列q的数据大小
buf unsafe.Pointer // points to an array of dataqsiz elements
elemsize uint16
closed uint32
elemtype *_type // element type
sendx uint // send index
recvx uint // receive index
recvq waitq // 因读(recv)而阻塞的等待队列
sendq

本文深入解析了CSP模型及其在Go语言中的实现,包括Channel的工作原理、分类及底层实现细节。探讨了无缓冲和有缓冲Channel的区别,以及读写Channel的操作流程。此外,还介绍了select语句在Go语言中的实现机制。
最低0.47元/天 解锁文章
536

被折叠的 条评论
为什么被折叠?



