channel
不同的线程使用锁来处理公共变量的资源竞争,这种方式就是所谓的通过共享内存来通信,而Go语言主张:
使用通信来共享内存,而不是通过共享内存来通信
具体就是指推荐使用 channel 来做 goroutine 之间的通信来确保线程安全。
如果说goroutine
是Go程序并发的执行体,channel
就是它们之间的连接。channel
是可以让一个goroutine
发送特定值到另一个goroutine
的通信机制。
Go 语言中的通道(channel)是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出(First In First Out)的规则,保证收发数据的顺序。
channel数据结构:
从某种程度上说,channel 是一个用于同步和通信的有锁队列(互斥锁解决线程竞争问题)
channel的缓冲区其实是一个环形队列
qcount
表示队列中元素的数量dataqsiz
表示环形队列的总大小buf
表示一个指向循环数组的指针sendx
和recvx
分别用来标识当前发送和接收的元素在循环队列中的位置recvq
和sendq
都是一个列表,分别用于存储当前处于等待接收和等待发送的Goroutine
Last updated
Was this helpful?