文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

彻底搞懂Channel原理之一

2024-12-02 20:11

关注

本文转载自微信公众号「吴亲强的深夜食堂」,作者吴亲库里。转载本文请联系吴亲强的深夜食堂公众号。

 躺的太久,该起床了。

宁可我卷死别人,不能让别人卷我。

之前断断续续看过Go几个模块的源码,可从未下笔,导致有些细节记不起来了。打算写一系列文章重新记录。

channel源码解析的文章太多了。一篇文章的长篇大论大部分人没耐心看完,所以我打算分开写,最后附上完整的ppt。

当然这其中不会涉及过多细节源码,因为有时候,细节是魔鬼。

介绍

channel一些基础介绍这里就不过多涉及了,都1202年了,我不相信用过Go的人没用过channel。

当然下图也涵盖了大部分使用姿势。

有一道使用channel进行任务编排的经典的题。题目如下:

有四个goroutine,编号为 1、2、3、4。每秒钟会有一个 goroutine打印自己的编号。请你实现这个程序,让输出的编号总是按照 1、2、3、4、1、2、3、4、……的顺序打印出来。就像这样,

可以自己先思考下,代码也可以通过后台回复击鼓传花获取。

原理解析

从一个简单的例子说起。

创建一个main.go文件,代码如下,

我们来看看这段代码编译以后长啥样。

想得到go程序的汇编代码并不难。

可以使用go tool compile -N -l -S main.go生成汇编代码:

或者使用go tool compile -N -l main.go先编译出代码,然后再使用go tool objdump main.o反汇编出代码。

还可以通过go build -gcflags -S main.go同样可以得到汇编的代码。

上面两种我就不演示了,可以自行实验。他们之中flag的具体含义也可以自行了解。

如果你觉得上面要自己敲代码比较麻烦,我推荐一个更加直接可视化的工具。

综上,从编译的代码我们可以看出,上述初始化一个channel,实际上调用的是runtime.makechan。

  1. ch := make(chan struct{}) 

图片从函数中,我们能知道最终返回一个runtime.hchan的指针。

runtime.hchan结构。

我们先来解释hchan结构体各个字段的含义,之后在案例介绍中会更加详细的说明他们的作用。

先来看qcount和dataqsiz有什么区别?

你去银行办事,银行有5个办事窗口,那么dataqsiz就等于5。在这里体现的是channel的容量为5。去银行的时候,当前有3个窗口有人正在办事,那么qcount就等于3,体现channel当前有3个数据元素。那么此时银行还可以再接待2个客户,对应还可以往channel发送2个数据元素。

其他字段现在看看说明就行了,后面会细讲。

到这里我们就知道创建一个channel本质上就是得到一个runtime.hchan的指针,后续对此chan的操作,无非就是对结构体字段进行相对应的操作。

同时我们也能猜出,为啥channel能在不同的g中传递消息,而对于使用者来说不用担心并发的问题。

其实就是hchan内部使用互斥锁来保证了并发安全。

最后我们来看一下runtime.makechan函数核心实现,当然注释已经很明白了。

可以看到创建的时候有一段switch分支代码,那么什么情况下会走对应的case呢?

根据上面的信息,我们可以得出,

总结

这篇我们主要介绍了如何获取go程序的汇编代码,通过汇编代码知道创建channel的具体函数runtime.makechan。

同时我们还知道不同的创建姿势会导致走向不同的内存空间分配逻辑。

最后通过创建函数我们知道channel在程序运行时是使用runtime.hchan来表示。

下一篇我们继续。

 

来源:吴亲强的深夜食堂内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯