码迷,mamicode.com
首页 > 其他好文 > 详细

go lang学习笔记——channel机理及调度理解

时间:2015-04-30 18:20:32      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:go语言编程   go   channel   goroutine   

《Go语言编程》一书介绍了libtask库,可以认为这个库等同于go的底层goroutine实现。
libtask库的channel的数据结构如下
struct Alt
{
Channel *c;
void *v;
unsigned int op;
Task *task;
Alt *xalt;
};
 
struct Altarray
{
Alt **a;
unsigned int n;
unsigned int m;
};
 
struct Channel
{
unsigned int bufsize;
unsigned int elemsize;
unsigned char *buf;
unsigned int nbuf;
unsigned int off;
Altarray asend;
Altarray arecv;
char *name;
};

我们可以看到channel的基本组成如下:
  内存缓存,用于存放元素;
  发送队列;
  接受队列。

书中罗列完channel的结构后没有深入讲解如何在channel这个结构上进行通信的过程。其实结合书中前面介绍的内容task(协程)的通信过程已经不言而明了。
但是从学习者的角度,当然是把这个问题讲解的越明白越好。接下来我试着介绍一下task(协程)是如何在这个channel的基础上通信的。
对于一个往channel里写数据的情况:
技术分享


对于一个从channel里读数据的情况:
技术分享

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

go lang学习笔记——channel机理及调度理解

标签:go语言编程   go   channel   goroutine   

原文地址:http://blog.csdn.net/nobugtodebug/article/details/45396507

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!