Golang -----channel

Channel

channel的作用

channel主要用于goroutine之间通讯和同步
设计思路是:不要通过共享内存来通讯,而是通过通讯来共享内存(前者就是传统的加锁,后者就是channel)

channel的底层数据结构

type hchan struct {//channel分为无缓冲和有缓冲两种。//对于有缓冲的channel存储数据,借助的是如下循环数组的结构qcount   uint           // 循环数组中的元素数量dataqsiz uint           // 循环数组的长度buf      unsafe.Pointer // 指向底层循环数组的指针elemsize uint16 //能够收发元素的大小closed   uint32   //channel是否关闭的标志elemtype *_type //channel中的元素类型//有缓冲channel内的缓冲数组会被作为一个“环型”来使用。//当下标超过数组容量后会回到第一个位置,所以需要有两个字段记录当前读和写的下标位置sendx    uint   // 下一次发送数据的下标位置recvx    uint   // 下一次读取数据的下标位置//当循环数组中没有数据时,收到了接收请求,那么接收数据的变量地址将会写入读等待队列//当循环数组中数据已满时,收到了发送请求,那么发送数据的变量地址将写入写等待队列recvq    waitq  // 读等待队列sendq    waitq  // 写等待队列lock mutex //互斥锁,保证读写channel时不存在并发竞争问题
}

在这里插入图片描述
总结hchan结构体的主要组成部分有四个:

  • 用来保存goroutine之间传递数据的循环链表。=====> buf。
  • 用来记录此循环链表当前发送或接收数据的下标值。=====> sendx和recvx。
  • 用于保存向该chan发送和从改chan接收数据的goroutine的队列。=====> sendq 和 recvq
  • 保证channel写入和读取数据时线程安全的锁。 =====> lock

未缓冲区channel就是数组长度为1的channel
缓存区channel就是数组长度大于1的channel

select 用法

go 的 select 为 golang 提供了多路 IO 复用机制,和其他 IO 复用一样,用于检测是否有读写事件是否 ready

  1. 仅支持channel,且单case:要么读,要么写
  2. 每个case的执行顺序是随机的<无序>
  3. 存在default,则select不会被阻塞。有一个case可以执行,也不会阻塞

Golang channel语句什么时候会被阻塞呢?

  1. 向未缓冲的channel发送数据(ch <- value)
  2. 从未缓冲的channel接收数据(value := <-ch)
  3. 向已满的缓冲channel发送数据
  4. 从空的缓冲channel接收数据
  5. select没有default时

思考

channel锁力度是多少?读写能并发吗?
由数据结构可以看出来,锁的力度是整个通道,读写实际是串形执行的
读写等待队列的作用是啥?是什么数据结构?
读写等待队列会在缓存区满的时候使用。 属于链式结构,存放的是goroutine,主要作用是保证gotoutine执行的顺序性.
缓存区满的时候明明会阻塞,那等待队列不是用一个元素就够了么?为啥是个链表?
因为可能会阻塞多个goroutine。这个时候需要保证被阻塞goroutine的顺序性
对一个已经关闭的channel读写元素会怎么样?
写操作会panic,读操作会立即返回(剩余数据/或者零值)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HashMap 的工作原理及其在 Java 中的应用?

在Java的数据结构中&#xff0c;HashMap是最常见且最重要的一个数据结构之一。HashMap是Java集合框架中的一部分&#xff0c;它存储的是键值对&#xff08;Key-value&#xff09;映射&#xff0c;也就是说&#xff0c;你可以通过键&#xff08;Key&#xff09;找到对应的值&…

选专业,如何分析自己的兴趣爱好?

在学习的过程中&#xff0c;我们对于有兴趣的学科往往精力充足&#xff0c;不知疲倦&#xff0c;从而相应科目的分数较高&#xff0c;而在得到较高的分数之后&#xff0c;个人自信更足&#xff0c;学习更轻松&#xff0c;竞争力更强大。 在专业选择当中&#xff0c;如果我们就…

urfread刷算法题day5|Set和排序|217. 存在重复元素

217. 存在重复元素 需要复习的知识点&#xff1a;Set、排序&#xff1b; Set

基于matlab的高斯滤波与图像去噪

1 高斯滤波原理 1.1 原理 高斯滤波是一种线性平滑滤波技术&#xff0c;主要用于消除图像中的高斯噪声。它的工作原理可以理解为对整幅图像进行加权平均的过程&#xff0c;即每个像素点的值都由其本身和邻域内的其他像素值经过加权平均后得到。 高斯滤波实质上是一种信号的滤…

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法

在连接数据库的时候出现了下面图面中的错误&#xff0c;尝试集中方法后终于解决了这个问题。 1.修改驱动程序版本 出现这种错误可能是因为你的驱动程序版本不兼容&#xff0c;我们可以尝试修改版本解决。而我们的驱动程序往往是以依赖的形式导入&#xff0c;因此可以在maven仓…

【UG\NX二次开发】部件间表达式 (字符串类型的) 问题记录

问题描述&#xff1a; 参数化建模项目中&#xff0c;为了防止表达式由于顺序问题&#xff0c;导致报错。则统一修改完表达式再进行uf_modl_update更新模型。但针对于部件间表达式 &#xff08;字符串类型的&#xff09;&#xff0c;某些情况下&#xff0c;会出现子部件的表达式…

HTML(16)——边距问题

清楚默认样式 很多标签都有默认的样式&#xff0c;往往我们不需要这些样式&#xff0c;就需要清楚默认样式 写法&#xff1a; 用通配符选择器&#xff0c;选择所有标签&#xff0c;清除所有内外边距选中所有的选择器清楚 *{ margin:0; padding:0; } 盒子模型——元素溢出 作…

MySQL锁、加锁机制(超详细)—— 锁分类、全局锁、共享锁、排他锁;表锁、元数据锁、意向锁;行锁、间隙锁、临键锁;乐观锁、悲观锁

文章目录 一、概述1.1 MySQL锁的由来1.2 锁定义1.3 锁分类 二、共享锁与排他锁2.1 共享锁&#xff08;S锁&#xff09;2.2 排他锁&#xff08;X锁&#xff09;2.3 MySQL锁的释放 三、全局锁3.1 介绍3.2 语法3.3 特点 四、表级锁4.1 介绍4.2 表锁4.3 元数据锁&#xff08;Meta D…

雷达标定与解析

融合雷达与解析雷达数据的相关代码。感谢开源社区的贡献。以下代码继承了很多人的工作。 如果是单雷达&#xff1a; 直接进行标定&#xff0c;所以就是接收相关的话题然后发布。 lidar_calibration_params.yaml&#xff1a; calibration:在这个接口里面x_offset: 0.0y_offset:…

u盘sd卡格式化怎么恢复,3种恢复方法教学

u盘sd卡格式化怎么恢复&#xff0c;这是许多人在误操作后最关心的问题。我们会详细介绍五种有效的恢复方法&#xff0c;并且提供恢复原理的教学视频&#xff0c;帮助您轻松找回U盘和SD卡上被格式化的数据。 一. 数据存储与恢复的原理 1. U盘、移动硬盘、硬盘以及固态盘存储数据…

自然语言处理:第三十八章: 开箱即用的SOTA时间序列大模型 -Timsfm

自然语言处理:第三十八章: 开箱即用的SOTA时间序列大模型 -Timsfm 文章链接:[2310.10688] A decoder-only foundation model for time-series forecasting (arxiv.org) 项目链接: google-research/timesfm: TimesFM (Time Series Foundation Model) is a pretrained time-ser…

IPD推行成功的核心要素(十二)CDP确保产品开发的正确方向

IPD体系是一种全新的产品研发管理模式&#xff0c;它将研发合格产品整个过程分为确保开发做正确的事和如何正确地做事两个阶段。确保开发做正确的事是指在产品进入研发之初就清晰地定义出有竞争力的产品&#xff0c;核心是确保产品能够对准客户需求&#xff0c;能够给客户带来商…

游戏高度可配置化(一)通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解

游戏高度可配置化&#xff08;一&#xff09;通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解 码客 卢益贵 ygluu 关键词&#xff1a;游戏策划 可配置化 模块化配置 数据引擎 条件系统 红点系统 一、前言 在插件式模块化软件开发当中&#xff0c;既要模块高度独…

封装一个上拉加载的组件(无限滚动)

一、封装 1.这个是在vue3环境下的封装 2.整体思路&#xff1a; 2.1传入一个elRef&#xff0c;其实就是一个使用页面的ref。 2.2也可以不传elRef&#xff0c;则默认滚动的是window。 import { onMounted, onUnmounted, ref } from vue; import { throttle } from underscore;ex…

ros 创建新的工作空间

创建工作空间 # catkin_ws是自己创建工作空间的名字 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace编译工作空间 cd ~/catkin_ws/src catkin_make打开并编辑 .bashrc 文件&#xff1a; nano ~/.bashrc在 .bashrc 文件末尾添加以下内容…

解决Windows下移动硬盘无法弹出的问题:\$Extend\$RmMetadata\$TxfLog\$TxfLog.blf

想弹出移动硬盘时&#xff0c;Windows告诉我设备正在使用 然后我使用LockHunter查看到底是哪个应用在使用我的移动硬盘&#xff0c;发现是 System(PID 4) E x t e n d Extend ExtendRmMetadata T x f L o g TxfLog TxfLogTxfLog.blf这个文件正在使用 这是一个索引文件 解决 …

数据清洗!即插即用!异常值、缺失值、离群值处理、残差分析和孤立森林异常检测,确保数据清洗的全面性和准确性,MATLAB程序!

适用平台&#xff1a;Matlab2021版及以上 数据清洗是数据处理和分析中的一个关键步骤&#xff0c;特别是对于像风电场这样的大型、复杂数据集。清洗数据的目的是为了确保数据的准确性、一致性和完整性&#xff0c;从而提高数据分析的质量和可信度&#xff0c;是深度学习训练和…

PTA基础题考点汇总

一&#xff1a;字符串&#xff08;数组&#xff09;的逆序&#xff0c;栈的方法 **字符串数组的逆序 : ** 标准容器库的知识&#xff1a;定义stack容器于字符串&#xff1a;stackv; string s&#xff1b; //这里用到了c中stl&#xff08;标准容器库的知识&#xff09;stack&…

一二三应用开发平台应用开发示例(4)——视图类型介绍以及新增、修改、查看视图配置

调整上级属性类型 前面为了快速展示平台的低代码配置功能&#xff0c;将实体文件夹的数据模型上级属性的数据类型暂时配置为文本类型&#xff0c;现在我们调整下&#xff0c;将其数据类型调整为实体&#xff0c;如下图所示&#xff1a; 数据类型需要选择实体&#xff0c;并在实…

STM32单片机系统

1.STM32最小系统 微型计算机&#xff08;面&#xff09; 单片机最小系统是指能够将单片机芯片运行所必需的最少的硬件电路集成在一起的系统。 它是一种基本的单片机应用系统&#xff0c;通常由主芯片&#xff0c;时钟电路&#xff0c;复位电路&#xff0c;电源电路&#xff0c…