主页 > 游戏开发  > 

golangchannel底层实现?

golangchannel底层实现?
底层数据实现

type hchan struct {     qcount   uint           // 当前队列中的元素数量     dataqsiz uint           // 环形队列的大小     buf      unsafe.Pointer // 指向环形队列的指针     elemsize uint16         // 元素大小     closed   uint32         // channel 是否关闭     elemtype *_type         // 元素类型     sendx    uint           // 发送索引     recvx    uint           // 接收索引     recvq    waitq          // 接收等待队列     sendq    waitq          // 发送等待队列     lock     mutex          // 互斥锁 }

buf是有缓冲的channel所特有的结构,用来存储缓存数据。是个循环链表sendx和recvx用于记录buf这个循环链表中的发送或者接收的indexrecvq和sendq分别是接收(<-channel)或者发送(channel <- xxx)的goroutine抽象出来的结构体(sudog)的队列。是个双向链表  lock 互斥锁在进行获取或者接收时都会进行加锁操作 channel的使用

创建channel实际上就是在内存中实例化了一个hchan的结构体,并返回一个ch指针

当channel缓存满了,或者没有缓存的时候,我们继续send(ch <- xxx)或者recv(<- ch)会阻塞当前goroutine

nil channel有值 channel没值 channel满 channel<- ch (发送数据)阻塞发送成功发送成功阻塞ch <- (接收数据)阻塞接收成功阻塞接收成功close(ch) 关闭channelpanic关闭成功关闭成功关闭成功

标签:

golangchannel底层实现?由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“golangchannel底层实现?