编程技术分享

  • 首页
  1. 首页
  2. Go
  3. 正文

Go channel源码分析

2023年3月5日 2657点热度 0人点赞 15条评论

1、channel数据结构

1.1 结构定义

//src/runtime/chan.go
type hchan struct {
    qcount   uint   //缓冲区队列中元素总数
    dataqsiz uint   //缓冲区队列大小
    buf      unsafe.Pointer //缓冲区队列,用于存放元素,该缓冲区模拟环形结构
    elemsize uint16 //元素大小
    closed   uint32 //channel是否关闭,关闭设为1
    elemtype *_type //元素类型
    sendx    uint   //发送索引,下一个待放入元素的索引
    recvx    uint   //接收索引,下一个待接收元素的索引
    recvq    waitq  //接收等待G队列
    sendq    waitq  //发送等待G队列
    lock     mutex  //channel操作过程中需加锁
}

1.2 结构图

  • elem:缓冲区存储的元素。
  • sudog:因接收或发送数据阻塞的G结构,条件满足时用于唤醒G运行。

2、channel操作

2.1 创建channel

创建channel函数为src/runtime/chan.go中makechan,该函数执行流程如下:

2.2 发送数据

发送数据函数为src/runtime/chan.go中chansend,该函数执行流程如下:

2.3 接收数据

接收数据函数为src/runtime/chan.go中chanrecv,该函数执行流程如下:

2.4 关闭channel

关闭channel函数为src/runtime/chan.go中closechan,该函数执行流程如下:

3、示例

测试用例代码如下:

//main.go
package main
func main() {
    ch := make(chan int)
    ch <- 123
    <- ch
    close(ch)
}

编译后生成的二进制解析为:

标签: 暂无
最后更新:2023年3月5日

jemuel

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论
文章目录
  • 1、channel数据结构
    • 1.1 结构定义
    • 1.2 结构图
  • 2、channel操作
    • 2.1 创建channel
    • 2.2 发送数据
    • 2.3 接收数据
    • 2.4 关闭channel
  • 3、示例
最新 热点 随机
最新 热点 随机
K8S源码分析系列2—远程调试K8S组件 Volcano源码分析系列—调度篇 K8S源码分析系列1—搭建K8S调试集群 K8S Controller开发 6.5840 Lab 1: MapReduce MongoDB源码分析系列1——编译环境搭建
K8S源码分析系列2—远程调试K8S组件
Golang优先级调度 Volcano源码分析系列—调度篇 MySQL源码分析系列1——编译环境搭建 K8S Controller开发 Go调度模型 K8S源码分析系列2—远程调试K8S组件

COPYRIGHT © 2021 www.miaozhouguang.com. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

粤ICP备2022006024号

粤公网安备 44030602006568号