channel是golang中很重要的概念,配合goroutine是golang能够方便实现并发编程的关键。channel其实就是传统语言的阻塞消息队列,可以用来做不同goroutine之间的消息传递,由于goroutine是轻量级的线程能够在语言层面调度,所以channel在golang中也常被用来同步goroutine。

一般channel的声明形式为:var chanName chan ElementType 
ElementType指定这个channel所能传递的元素类型。

定义一个channel也很简单,直接使用内置的函数make()即可: 
ch := make(chan int,bufferSize) //bufferSize为缓冲区的大小,可以不传递该值代表不带缓冲区的channel

消息传递

带有缓冲区的channel一般用来做不同goroutine之间的消息传递。最经典的解释莫过于生产者-消费者了。生产者向channel中写数据,如果channel缓冲区已满,则生产者会被阻塞直到消费者消费缓冲区中的数据后才能被唤醒。 
消费者从channel中读取数据,如果缓冲区中没有任何数据则消费者会阻塞直到生产者将数据写入才能被唤醒。

假设我们有30个学生做作业,做完作业后由一个老师批改作业。用go怎么实现呢,我们首先定义一个带有缓冲区HomeWork chan(缓冲区的大小与学生数目相同,主要是为了防止学生提交作业时阻塞),学生做完作业向hwChan中发送数据,老师等待hwChan中有数据就取出学生作业然后批改。

channel是消息传递的机制,用于多线程环境下lock free synchronization.

它同时具备2个特性:
1. 消息传递
2. 同步
channel的实现,都在$GOROOT/src/pkg/runtime/chan.c里
它是通过共享内存实现的
struct Hchan {
}
ch := make(chan interface{}, 5)
具体的实现是chan.c里的 Hchan* runtime·makechan_c(ChanType *t, int64 hint)
此时,hint=5, t=interface{}它完成的任务就是:
分配hint * sizeof(t) + sizeof(Hchan)的内存空间[也就是说,buffered chan的buffer越大,占用内存越大]ch <- 5
就会调用 void runtime·chansend(ChanType *t, Hchan *chan, byte *ep, bool *pres)lock(chan)如果chan是buffer chan {比较当前已经放入buffer里的数据是否满了A如果没有满 {把ep(要放入到chan里的数据)拷贝到chan的内存区域 (此区域是sender/recver共享的)找到receiver goroutine, make it ready, and schedule it to recv} else {已经满了把当前goroutine状态设置为Gwaitingyield}} else {// 这是blocked chan
            找到receiver goroutine (channel的隐喻就是一定存在多个goroutine)让该goroutine变成ready (之前是Gwaiting), 从而参与schedule,获得控制权具体执行什么,要看chanrecv的实现}

参考:http://www.voidcn.com/blog/kjfcpua/article/p-2921075.html
http://shanks.leanote.com/post/%E6%B7%B1%E5%BA%A6%E5%89%96%E6%9E%90channel

转载于:https://www.cnblogs.com/bonelee/p/6056373.html

golang channel本质——共享内存相关推荐

  1. 共享内存 传一个类指针_大神是如何学习 Go 语言之为什么使用通信来共享内存...

    为什么这么设计(Why's THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点.对具体实现造成的影响 ...

  2. golang channel 管道 通道 信道 使用总结

    不同于传统的多线程并发模型使用共享内存来实现线程间通信的方式,golang 的哲学是通过 channel 进行协程(goroutine)之间的通信来实现数据共享: > Do not commun ...

  3. Golang面向并发的内存模型

    Golang面向并发的内存模型 在早期,CPU都是以单核的形式顺序执行机器指令.Go语言的祖先C语言正是这种顺序编程语言的代表.顺序编程语言中的顺序是指:所有的指令都是以串行的方式执行,在相同的时刻有 ...

  4. GO、Rust 这些新一代高并发编程语言为何都极其讨厌共享内存?

    作者 | 马超   责编 | 王晓曼 出品 | CSDN博客 今天我想再来讨论一下高并发的问题,我们看到最近以Rust.Go为代表的云原生.Serverless时代的语言,在设计高并发编程模式时往往都 ...

  5. 并发编程含义比较广泛,包含多线程编程、多进程编程及分布式程序等 目录 1. “共享内存系统”,消息传递系统”。 1 1.1. 共享模式 多进程 多线程 1 1.2. Actor消息模式 事件驱动 2

    并发编程含义比较广泛,包含多线程编程.多进程编程及分布式程序等 目录 1. "共享内存系统",消息传递系统". 1 1.1. 共享模式 多进程 多线程 1 1.2. Ac ...

  6. golang——channel

    目录 1.分类 channel的三种状态 channel的两种类型--有缓冲,无缓冲 无缓冲 有缓冲 2.操作 1.创建 2.发送 3.接收 4.关闭 3.使用场景 4.channel底层 5.cha ...

  7. showdialog 尝试读取或写入受保护的内存_TreadMarks: 基于工作站网络的共享内存计算...

    TreadMarks: 基于工作站网络的共享内存计算 以前学MIT6.824时看过TreadMarks相关论文,这篇论文当时只翻译了一半.最近无意中看到这篇未完成的翻译,google了下发现仍然没有人 ...

  8. Linux的IPC机制(一):共享内存

    0. 共享内存 比喻 本质 多个进程访问同一个逻辑内存 直接访问内存,不用read()/write()非常方便 1. POSIX 共享内存 资料:unpv22e-ch13 查看: man shm_ov ...

  9. C++中的union(联合体,共用体,数据变量可以共享内存,以节省内存空间)

    union介绍 C++的union本质上也是个类,跟struct性质几乎一致但是有一个最大的区别,数据共享内存. 说到共享内存就要说下union的内存分配:union的大小是按照union里面的成员内 ...

最新文章

  1. 模式窗口window.open造成Session丢失的解决方法
  2. 串口服务器怎么测信号,串口服务器如何调试
  3. vue 判断同一数组内的值是否一直_vue一些笔记
  4. 计算机应用基础山东省,2019年山东省中等职业学校对口升学考试:计算机文化基础+计算机应用基础模拟试卷...
  5. idea启动jsp项目
  6. Android底层隐私数据,一种Android应用程序隐私数据泄露离线检测方法
  7. ADL平台上传数据前的准备工作
  8. ant design vue 中a-tree搜索查询
  9. 电子科技大学计算机专业考什么,2015年电子科技大学081203计算机应用技术考研专业目录及考试科目...
  10. 从高级程序员-资深程序员-技术总监,我都为你整理好了学习路径
  11. jzoj. 4298. 【NOIP2015模拟11.2晚】我的天
  12. 开源小程序CMS网站, JeeWx-App-CMS 1.0 首版本发布
  13. Android使用TextToSpeech实现语音播报-及默认不支持中文的方案
  14. 美团“杀熟”,最终收割谁?
  15. 使用WASD键移动对象
  16. 1528. 重新排列字符串
  17. [COI2007] Patrik
  18. 系统管理员在用友ERP U9 集团化应用中的烦恼与解决方案!
  19. PAT乙级(简单模拟)1001、1011、1016、1026、1046、1012、1018
  20. (二)Python Excel 操作

热门文章

  1. java 报表导出_Java Excel报表导出Demo
  2. 服务器自动安全审计,用于Linux服务器的自动安全审计工具
  3. 内存分配_go内存分配管理
  4. 百度地图android自定义文字,androidsdk | 百度地图API SDK
  5. saxon java_如何将Saxon设置为Java中的Xslt处理器?
  6. Java后端向前端传递数据,挥泪整理面经
  7. 解决Latex图片或者表格浮动
  8. 【Deep Learning笔记】用Inception-V3模型进行图像分类
  9. python【蓝桥杯vip练习题库】BASIC-14 时间转换(取余 水题)
  10. oracle 输出重复记录,ORACLE 去除重复记录