循环buffer“一写多读“

1.往期回顾

  1. 一个简单实用的循环buffer,用于缓冲数据!测试500M数据,耗时1.3秒。

  2. C语言版本的循环buffer比C++版本的速度更快!测试500M数据0.5秒,达9.25Gbps左右!

  3. C 语言免拷贝版本循环 buffer 比拷贝版本快了近 10 倍!

之前分享过一些循环buffer缓冲区的实现,有C++版本的、C语言版本的、C语言免拷贝版本的,本质上都是基于环形缓冲区思想实现的"一写一读"循环buffer,今天给大家分享一个"一写多读"版本的循环buffer。

2. 简介

”一写多读“循环buffer即一个写者往循环buffer缓冲区写入数据,多个读者从循环buffer缓冲区读取数据,通过管理各种读写指针的位置进行数据保护。通过这种机制实现一份数据共享给不同模块使用且互不干扰,隔离模块,降低耦合

”一写多读“循环buffer的示意图如下所示,本例中有3个读指针,1个写指针,所有指针顺时针方向移动。红色区域是写指针写入数据,暂无读者读取数据;绿色区域是部分读者未读完数据的区域;黄色区域是所有读者都读完数据的区域。

图1 "一写多读"循环buffer 示意图

图1 "一写多读"循环buffer 示意图

3. 设计思想

要想实现读写指针流动且访问数据不冲突,即把握两点:对照下图

  1. 写指针不能追上超过最后一个读指针,即本例中的读指针1,此时对于写指针来讲,可写入数据的空间为黄色部分。

  2. 所有读者不能追上超过写指针。本例中读指针3此时可读取数据的区域为红色部分;读指针2此时可读取数据区域是蓝色+红色区域;读指针3此时可读取数据区域是绿色+蓝色+红色区域。

图2 "一写多读循环buffer 指针标识图

图2 "一写多读循环buffer 指针标识图

4. 设计实现

循环缓冲区本质是一块连续的内存空间,通过管理读写指针位置实现数据共享,如下图所示。当指针到达右边边界即buffer结束地址,通过取余的方式讲指针回环到左边对应位置,实现循环流动。

图3 "一写多读"循环buffer 内存布局

图3 "一写多读"循环buffer 内存布局

结构体设计及函数设计如下,包含写指针,读者数组,因为读者数目可配置。add函数指针实现添加读者,read实现读取数据,write实现向缓冲区写入数据。

typedef struct m_ringbuffer
{
    struct readpos_t *arr_pos[MAX_READ_NUM];/* 读者信息数组    */  
    volatile int w_pos;          /* 写入数据指针位置 */
    int          read_cnt;       /* 读者数量       */
    int rb_overflow_cnt;         /* 记录缓冲区溢出的次数     */
    int rb_size, rb_size_mask;   /* 缓冲区空间大小  */
    uint8_t*      rb_buffer;     /* 缓存数据空间    */
    int (*add)(void* pthis);     /* 向循环buffer添加一个读者 */
    int (*write)(void* pthis, const uint8_t* buffer, int len); /* 写数据函数 */
    int (*read)(void* pthis, int readid, uint8_t **buffer, int len); /* 读数据函数 */
}m_ringbuffer_t;

/**
 * @brief 从循环buffer空间读取数据
 * @param pthis 循环buffer句柄
 * @param readid 读者的id,区分读者
 * @param buffer 要的数据指针的地址
 * @param len 要读取数据的长度
 * @return -1:参数错误 -2:可读空间不够 len:读取的数据长度
*/
static int mrb_read(void* pthis, int readid, uint8_t **buffer, int len);

/**
 * @brief 向循环buffer空间写入数据
 * @param pthis 循环buffer句柄
 * @param buffer 要写入的数据
 * @param len 要写入数据的长度
 * @return -1:参数错误 -2:可写空间不够 0:写入成功
*/
int mrb_write(void* pthis, const uint8_t* buffer, int len);

/**
 * @brief 向循环buffer添加读者
 * @param pthis 循环buffer句柄
 * @return -1:添加失败  id:读者ID
*/
static int mrb_add(void* pthis);

5. 使用示例

int ret, len, data_len, id;
uint8_t *buf;

 //创建缓冲区
 m_ringbuffer_t* rb = create_muti_ringbuffer(50*1024);
 //添加读者
 id = rb->add(rb);
 //往循环buffer中写数据
 ret = rb->write(rb, buf, data_len); 
 //从缓冲区读取数据
 rb->read(rb, read_id, &buf, data_len);

完整工程代码见:https://github.com/young-1-code/data_structure.git取代码的小伙伴请帮忙点一个star吧~感谢~

编译平台:Linux系统 编译工具:GCC 编译:输入make进行编译,工程测试是读写文件进行的,所以需要给一个数据源路径,可参考往期循环buffer测试,见开篇链接。

图4 代码位置

图4 代码位置

6.总结

至此我们实现了”一写一读“、”一写多读“循环buffer,每一种实现版本都有它合适的应用场景,需要根据具体需求选择。实现不同的数据结构不是重点,本系列循环buffer有多种不同变体,本质上都是根据循环缓冲区设计实现的,所以重点是一种理解设计思想,通过迁移变换,设计不同数据结构满足不同需求场景。 欢迎大家一起交流学习,帮忙点赞、在看、转发吧~~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

apexcharts数据可视化之饼图

apexcharts数据可视化之饼图 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式: 基础饼图单色饼图图片饼图 基础饼图 import ApexChart from react-apexcharts;export function SimplePie() {// 数据序列const series [44, 55, 13, 43, 22]// …

2024年下半年自考报名信息汇总

2024年下半年自考报名信息汇总,报名详细流程如下图所示:

抖店起店玩法,2024年最新保姆级抖音小店开店教程

课程下载:https://download.csdn.net/download/m0_66047725/89360739 更多资源下载:关注我。 课程内容: 1-抖音如何精细化选品 2-达人合作的谈判技巧 3-达人合作细节注意事项 4-短视频达人筛选方法与数据维度 5-短视频带货达人分析工具…

C++青少年简明教程:for循环语句

C青少年简明教程:for循环语句 C的for循环语句是一种迭代控制语句,用于重复执行一段代码。 语法格式: for(表达式1;表达式2;表达式3) 循环体 for循环语句执行流程图: 不太好理解,请看下图&am…

SpringJDBC

1.前言 Spring JDBC可以帮助开发者节省大量开发工作 自动去处理一些低级细节 比如:异常处理、打开和关闭资源(Connection、PreparedStatement、Statement、ResultSet) 需要下载的jar包: spring-jdbc(普通jar包、源码jar包)由于没有依赖其他的jar包 所以只…

探寻数据处理的高效之道:从Python内置方法到NumPy的飞跃

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:为什么要学习NumPy? 二、案例展示:创建整数序列…

Apifox 更新|编排模式、Markdown 编辑器升级、自动申请 SSL 证书、用户反馈问题优化

Apifox 新版本上线啦! 看看本次版本更新主要涵盖的重点内容,有没有你所关注的功能特性: 自动化测试新增「编排模式」Markdown 编辑器全新升级返回响应直接预览 PDF 及视频自动申请 SSL 证书支持配置自定义域名的子目录流式接口支持筛选和清…

Vue 菜单组件开发教程

在 Vue 项目中&#xff0c;我们常常需要构建各种菜单结构。下面就来详细介绍如何基于给定的代码来开发一个菜单组件。 组件部分 一、模板部分 <template> <template v-for"item in menuTree" :key"item._id"> <el-sub-menu v-if"i…

OpenHarmony 适配HDMI接口声卡

高清多媒体接口&#xff08;High Definition Multimedia Interface&#xff0c;HDMI &#xff09;是一种全数字化视频和声音发送接口&#xff0c;可以发送未压缩的音频及视频信号。HDMI可用于机顶盒、DVD播放机、个人计算机、电视、游戏主机、综合扩大机、数字音响与电视机等设…

【智能算法应用】灰狼算法GWO求解三维路径规划问题

目录 1.算法原理2.三维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】灰狼算法&#xff08;GWO&#xff09;原理及实现 2.三维路径规划数学模型 三维地形可以等效处理成山峰地形&#xff0c;数学模型为: z ( x , y ) h 0 ∑ j 1 N h j max ⁡…

升级鸿蒙4.2新变化,新增 WLAN 网络自动连接开关!

手机已经成为现代人生活中不可或缺的一部分&#xff0c;手机里的功能可以满足大部分人的生活场景&#xff0c;但是最依赖的应该就是手机网络&#xff0c;手机网络突然变差怎么办——消息发不出去&#xff1f;刷新闻速度变慢&#xff1f;仔细检查后&#xff0c;发现其实不是手机…

OrangePi Kunpeng Pro ——信创再接力

文章目录 OrangePi Kunpeng Pro ——信创再接力1. 绪论1.1 开箱 2. 硬件介绍2.1 硬件配置2.2 硬件清单 3. 网络测试3.1 有线连接3.2 WIFI连接 4.查看系统配置5. 安装常用软件5.1 安装python5.1.1 更换pip源为国内清华源 5.2 安装docker5.3 安装opencv5.4 安装dlib 6.CPU多进程能…

闲话 .NET(3):.NET Framework 的缺点

前言 2016 年&#xff0c;微软正式推出 .NET Core 1.0&#xff0c;并在 2019 年全面停止 .NET Framework 的更新。 .NET Core 并不是 .NET Framework 的升级版&#xff0c;而是一个从头开始开发的全新平台&#xff0c;一个跟 .NET Framework 截然不同的开源技术框架。 微软为…

计算属性与监听属性

【 1 】计算属性 计算属性大致就是这样 # 1 计算属性是基于它们的依赖进行缓存的# 2 计算属性只有在它的相关依赖发生改变时才会重新求值# 3 计算属性就像Python中的property&#xff0c;可以把方法/函数伪装成属性 # 计算属性本质上是一个函数&#xff0c;它们可以通过 get…

UML 在 vs-code上的快速使用

UML 在 vs-code上的快速使用 1.软件准备工作2.创建第一张甘特图2.1 创建 UML文件: xxxx. puml2.2 输入甘特图代码2.3 VS code 生成甘特图 结束 。 1.软件准备工作 使用的软件为&#xff1a;VS CODE使用插件 &#xff1a; PluntUML2.创建第一张甘特图 2.1 创建 UML文件: xxxx. …

基于python flask的疾病数据采集与可视化大屏,实现关联规则算法的治疗方法分析

背景 基于Python Flask的疾病数据采集与可视化大屏&#xff0c;旨在实现对疾病数据的采集、分析和可视化展示&#xff0c;为医疗领域提供决策支持和治疗方法分析。其中&#xff0c;关联规则算法被应用于治疗方法分析&#xff0c;旨在发现不同治疗方式之间的关联性和规律性&…

容器监控方案

1、docker部署prometheus Prometheus是一套开源的系统监控报警框架&#xff0c;它基于时序数据库&#xff0c;并通过HTTP协议周期性地从被监控的组件中抓取指标数据。以下是一些关于Prometheus的详细介绍&#xff1a; 基本概念&#xff1a;Prometheus所有采集的监控数据均以指…

阿里开源React应用动效解决方案:ant-motion

ant-motion&#xff1a;简化动效开发&#xff0c;提升用户体验 - 精选真开源&#xff0c;释放新价值。 概览 Ant Motion是由Ant Design团队精心打造&#xff0c;专为React应用设计的动画规范和组件库。它不仅仅是一套动画规范&#xff0c;更是一个完整的解决方案&#xff0c;旨…

[SCTF2019]Who is he

unity 游戏&#xff0c;直接输入字符串 直接修改 if 判断&#xff0c;看能不能直接输出flag 修改了程序逻辑&#xff0c;但还是输出了 明明已经把这个 if 删了 不知道为什么还会输出这串字符 应该程序还有什么引入吧&#xff0c;看 wp 应该先查一下程序的动态链接库 DLL 是…

探讨大米自动化生产线包装设备的智能化发展趋势

随着科技的飞速发展&#xff0c;智能化已经成为各行各业转型升级的重要方向。在大米生产领域&#xff0c;自动化生产线包装设备的智能化发展更是引领着粮食产业的未来潮流。星派将从智能化技术、市场需求、发展趋势等方面&#xff0c;探讨大米自动化生产线包装设备的智能化发展…