channel机理及调度理解

好书推荐:

算法基础:打开算法之门

作者:(美) 托马斯 H. 科尔曼(Thomas H. Corme

当当 广告

购买

深入理解Redis

作者:(美)Jeremy Nelson(杰里米.尼尔森) 著,汪佳南 译

当当 广告

购买

Linux性能优化

作者:菲利普G.伊佐特、 贺莲

当当 广告

购买


《Go语言编程》一书介绍了libtask库,可以认为这个库等同于go的底层goroutine实现。

libtask库的channel的数据结构如下:

 1struct Alt
 2{
 3Channel *c;
 4void *v;
 5unsigned int op;
 6Task *task;
 7Alt *xalt;
 8};
 9struct Altarray
10{
11Alt **a;
12unsigned int n;
13unsigned int m;
14};
15struct Channel
16{
17unsigned int bufsize;
18unsigned int elemsize;
19unsigned char *buf;
20unsigned int nbuf;
21unsigned int off;
22Altarray asend;
23Altarray arecv;
24char *name;
25};

我们可以看到channel的基本组成如下:

内存缓存,用于存放元素;

发送队列;

接受队列。

书中罗列完channel的结构后没有深入讲解如何在channel这个结构上进行通信的过程。其实结合书中前面介绍的内容task(协程)的通信过程已经不言而明了。

但是从学习者的角度,当然是把这个问题讲解的越明白越好。接下来我试着介绍一下task(协程)是如何在这个channel的基础上通信的。

对于一个往channel里写数据的情况:

对于一个从channel里读数据的情况:

注意:以上两个流程都是基于书中对协程的工作原理和channel数据结构的介绍后我个人脑补的,并没有去翻看libtask的代码。很可能存在疏漏,只应当把这两个流程作为理解协程工作方式的参照。

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2018-06-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java社区

粉丝福利 | 150G编程资源免费分享

1253
来自专栏企鹅号快讯

再谈前后端分离

前段时间我针对手头上的项目前端配置进行了反思以及总结并且写了两篇文章:webpack传统后端渲染的项目前端配置,webpack配置之前后端不分离, 很显然这些配...

2378
来自专栏Kirito的技术分享

一个DDD指导下的实体类设计案例

终于开通原创功能了,大家以后可以在文章下方留言了,欢迎交流。 1 前言 项目开发中的工具类代码总是随着项目发展逐渐变大,在公司诸多的公用代码中,笔者发现了一个...

3817
来自专栏跨界架构师

如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码:

1163
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试复习大纲2.0(持续更新)

想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面...

4857
来自专栏数据小魔方

sparklines迷你图系列3……Evolution(Line)

该类型图表既然被划分到Evolution类型,想必大家也能大概猜出其用途,就是用于评估指标走势的优劣、好坏与波动区间范围。 这样形式可以更好的呈现一类指标一段时...

33010
来自专栏FreeBuf

XSS挑战第一期Writeup

0×00起因 这期XSS挑战的起因是在阅读“Modern Web Application Firewalls Fingerprinting and By...

24010
来自专栏HansBug's Lab

【备忘】Idea的那些事

说到Java的IDE,似乎eclipse和Idea是目前的主流。然而,OO的课程组却一直在推荐使用eclipse,于是很多人就这样错过了Idea这样强大的IDE...

4229
来自专栏即时通讯技术

微信团队原创分享:iOS版微信的内存监控系统技术实践

FOOM(Foreground Out Of Memory),是指App在前台因消耗内存过多引起系统强杀。对用户而言,表现跟crash一样。Facebook早在...

1182
来自专栏CDA数据分析师

一个 Pythoner的 Awesome List

? 从大三接触 Python 到现在几乎已经有两年的接触经验了,除去中间有一年左右接私活写写 Android 和 Lamp 之外,有 Python 实际项目开...

2536

扫码关注云+社区