首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >go-数据结构-chan

go-数据结构-chan

原创
作者头像
一只羊羊
发布2025-03-25 11:23:25
发布2025-03-25 11:23:25
720
举报

chan的结构

  • qcount记录队列中的原始数量
  • buf 环形队列,用来储存channel中的数据
  • closed 标识chanel是否被关闭
  • sendx 指向环节队列写入下标,表示可以写入数据的位置
  • recvx 指向环形队列读取下标,表示可以读取数据的位置
  • recvq 用来存储等待读取的协程链表(双向链表)
  • sendq 用来存储等待写入的协程链表(双向链表)

过程 (写和close过程中针对chan为空或者对已关闭的chan做写操作会强制panic)

读过程

  • 若sendq为空,且无缓冲区,则将当前协程加入recvq等待有数据后被唤醒
  • 若sendq为空,且有缓存区且有数据,则直接从buf中读取
  • 若sendq不为空,且无缓冲区,则取sendq队列头的协程SG数据放入读协程RG中,SG被唤醒后返回
  • 若sendq不为空,且有缓冲区,则取buf的recvx位置的数据,并将sendq头的协程数据放入buf的sendx位置,并移动recvx和sendx位置

写过程

  • 判断closed是否是关闭标识,是则panic
  • 若recvq不为空,则无缓冲,则直接将数据给recvq头协程G,唤醒并返回
  • 若recvq不为空,有缓冲(但无数据),则直接将数据给recvq头协程G,唤醒并返回
  • 若recvq为空,无缓冲,等将写协程G放到sendq中等待被唤醒
  • 若recvq为空,有缓冲,将数据放入缓存区buf,但若buf已满,则放到sendq等待

关闭过程

  • chan为空,则panic
  • closed已经是关闭标识,则panic
  • 若sendq中还有协程等待,则panic

chan常见的panic场景

  • 关闭nil chan
  • 关闭已关闭的chan
  • 关闭chan时sendq还存在未处理完的协程
  • 向已关闭的chan写数据

注意:参考书籍地址:https://docs.kilvn.com/GoExpertProgramming/chapter07/7.1-foreword.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • chan的结构
  • 过程 (写和close过程中针对chan为空或者对已关闭的chan做写操作会强制panic)
    • 读过程
    • 写过程
    • 关闭过程
  • chan常见的panic场景
    • 注意:参考书籍地址:https://docs.kilvn.com/GoExpertProgramming/chapter07/7.1-foreword.html
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档