golang channel

傲渊山岳  金牌会员 | 2023-12-23 04:13:35 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 934|帖子 934|积分 2802

”不要以共享内存的方式来通信,相反,要通过通信来共享内存“
golang 的一个思想,不整文的,整点武的,具体来看channel 怎么做的
有一个很关键的 golang MPG 模型再单独分析,这篇先只分析 channel
定义
  1. // runtim/chan.go
  2. type hchan struct {
  3.         qcount   uint           // 通道里的元素数量
  4.         dataqsiz uint           // 通道的总大小
  5.         buf      unsafe.Pointer // 通道底层循环数组的指针
  6.         elemsize uint16 // 每个元素的大小
  7.         closed   uint32 // 通道是否关闭,不能重复关闭,会 panic
  8.         elemtype *_type // 通道里元素的类型
  9.         sendx    uint   // 通道里发送元素的下标
  10.         recvx    uint   // 接受元素的下标
  11.         recvq    waitq  // 准备接受的协程链表
  12.         sendq    waitq  // 准备发送的写成链表
  13.         lock mutex // 通道锁,chan 是并发安全的
  14. }
复制代码
链表,保存发送或接受协程
  1. // runtim/chan.go
  2. type waitq struct {
  3.         first *sudog
  4.         last  *sudog
  5. }
复制代码

初始化

channel使用 make 初始化
  1. c  := make(chan int) // 无缓冲
  2. c2 := make(chan int,10) // 有缓冲
复制代码
当无缓冲时,直接创建,当有缓冲时,还要调用 mallocgc 函数,申请空间,具体代码可以看 runtime/chan.go

发送数据

使用来说很简单,下面的代码如果 channel 满了或者无缓冲无接受者的话就会阻塞
[code]c

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表