03. 通道- channel
Golang 中的通道(channel)是一种用于在不同goroutine之间传递数据的机制。通道可以看作是一个管道,允许一个goroutine将数据发送到另一个goroutine。通道在并发编程中非常有用,因为它们提供了一种安全且高效的方式来进行数据交换和同步。
Golang中channel是goroutine间重要的通信方式,是并发安全的
3.1 channel 数据结构
1 | type hchan struct { |
hchan结构体中的buf指向一个数组,用来实现循环队列,sendx是循环队列的队尾指针,recvx是循环队列的队头指针。dataqsize是缓存型通道的大小,qcount记录着通道内数据个数。
循环队列一般使用空余单元法来解决队空和队满时候都存在font=rear带来的二义性问题,但这样会浪费一个单元。golang的channel中是通过增加qcount字段记录队列长度来解决二义性,一方面不会浪费一个存储单元,另一方面当使用len函数查看通道长度时候,可以直接返回qcount字段,一举两得。
hchan结构体中另一重要部分是recvq,sendq,分别存储了等待从通道中接收数据的goroutine,和等待发送数据到通道的goroutine。两者都是waitq类型。
waitq是一个结构体类型,waitq和sudog构成双向链表,其中sudog是链表元素的类型,waitq中first和last字段分别指向链表头部的sudog,链表尾部的sudog。
1 | type waitq struct { |

__END__