循环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有多种不同变体,本质上都是根据循环缓冲区设计实现的,所以重点是一种理解设计思想,通过迁移变换,设计不同数据结构满足不同需求场景。 欢迎大家一起交流学习,帮忙点赞、在看、转发吧~~

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

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

相关文章

Golang并发编程-协程goroutine的信道(channel)

文章目录 前言一、信道的定义与使用信道的声明信道的使用二、信道的容量与长度三、缓冲信道与无缓冲信道缓冲信道无缓冲信道四、信道的初体验信道关闭的广播机制总结前言 Goroutine的开发,当遇到生产者消费者场景的时候,离不开 channel(信道)的使用。 信道,就是一个管道,…

Redis介绍及安装配置

1 什么是Redis Redis 的定义:Redis(Remote Dictionary Server 远程字典服务)是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 可见Redis和我们最经常使用的MySQL都…

技术创新加速生态繁荣 | 软通动力子公司鸿湖万联亮相OpenHarmony开发者大会2024

5月25日,由开放原子开源基金会OpenHarmony项目群工作委员会主办的OpenHarmony开发者大会2024在深圳成功举行。本次大会紧扣OpenHarmony 4.1 Release版本发布契机,以“鸿心聚力,智引未来”为主题、通过“1场主论坛6场技术分论坛”承载&#xf…

mysql 8 [HY000][1114] The table ‘/tmp/#sql4c3_3e5a0_2‘ is full

分组有个比较大的表,出现了临时表空间满了的情况; 试用该sql 语句: SHOW GLOBAL VARIABLES LIKE internal_tmp_mem_storage_engine; 可以看到 默认临时结果是用临时表存的,在mysql的my.cnt可以改临时空间的大小 但是磁盘哪有内…

5.28学习总结

java复习总结 hashcode()和equals() hashcode():在Object里这个方法是通过返回地址的整数值来生成哈希值。 equals():在Object里这个方法是通过比较他们的内存地址来确定两个对象是否相同。 运行效率:hashcode的时间复杂度为O(1)(因为只要计算一次哈…

Vue 菜单组件开发教程

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

EtherCAT协议概述

EtherCAT 是由德国 BECKOFF 自动化公司于2003年提出的实时工业以太网技术。它具有高速和高数据有效率的特点&#xff0c;支持多种设备连接拓扑结构。其从站节点使用专用的控制芯片&#xff0c;主站使用标准的以太网控制器。 EtherCAT 的主要特点如下 : ①泛的适用性&#xff0c…

【Pandas】深入解析`pd.read_sql()`函数

【Pandas】深入解析pd.read_sql()函数 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xf…

《KAN》论文笔记

原文出处 KAN: Kolmogorov–Arnold Networks (arxiv.org)https://arxiv.org/html/2404.19756v1 论文笔记 What 《KAN: Kolmogorov–Arnold Networks》——我们提出了 KolmogorovArnold Networks (KANs) 作为多层感知器 (MLP) 的有前途的替代方案。 我们表明&#xff0c;这…

STM32简易音乐播放器(HAL库)

一、设计描述 本设计以STM32MP157A单片机为核心控制器&#xff0c;加上其他的模块一起组成基于单片机的音乐盒的整个系统&#xff0c;通过不同频率的PWM使蜂鸣器播放音乐&#xff0c;通过按键中断实现歌曲切换&#xff0c;音量调节&#xff0c;定时器中断实现播放速度调节&…

kafka-生产者发送消息消费者消费消息

文章目录 1、生产者发送消息&消费者消费消息1.1、获取 kafka-console-producer.sh 的帮助信息1.2、生产者发送消息到某个主题1.3、消费主题数据 1、生产者发送消息&消费者消费消息 1.1、获取 kafka-console-producer.sh 的帮助信息 [rootlocalhost ~]# kafka-console…

Xunsearch:实现拼音搜索和中文分词功能

首先我们需要安装xunsearch扩展库&#xff0c;参考 1、设置分词器和拼音搜索功能 在创建Xunsearch对象后&#xff0c;可以设置相应的分词器和拼音搜索功能。以下代码示例演示了如何设置分词器和拼音搜索功能&#xff1a; $index $xunsearch->index; $index->setToken…

解决SSH客户端远程连接CentOS7虚拟机时加载过慢问题

1、编辑 /etc/ssh/sshd_config 文件&#xff0c;将 useDNS 中的 yes 改为 no &#xff0c;关闭UseDNS加速&#xff1a; vi /etc/ssh/sshd_config2、重启ssh服务: systemctl restart sshd

Golang 创建第一个web项目(Gin + Gorm)

1. 写这篇博客的由来&#xff1a; 当你想使用最快的框架创建项目的时候是不是有点束手无策&#xff1f; 当你想配置数据库写 SQL 甚至不知道如何写&#xff0c;文件夹都不知道建在哪里&#xff1f; &#x1f604;因为Golang 目前并没有 JAVA 那种硬性规范&#xff0c;但是…

kafka-主题创建(主题操作的命令)

文章目录 1、topic主题操作的命令1.1、创建一个3分区1副本的主题1.1.1、获取 kafka-topics.sh 的帮助信息1.1.2、副本因子设置不能超过集群中broker的数量1.1.3、创建一个3分区1副本的主题1.1.4、查看所有主题1.1.5、查看主题详细描述 1、topic主题操作的命令 kafka发送消息会存…

巨额分红与大幅下调募资金额,小方制药注册生效半年后仍无进展

《港湾商业观察》施子夫 2022年7月1日&#xff0c;上海小方制药股份有限公司&#xff08;以下简称&#xff0c;小方制药&#xff09;递表上交所板&#xff0c;2023年9月1日公司提交了注册申请&#xff0c;并于同年12月19日获得生效。 离挂牌上市仅有一步之遥的小方制药注册生…

flutter开发实战-外接纹理texture处理图片展示

flutter开发实战-外接纹理处理图片展示 在Flutter中&#xff0c;如果你想要创建一个外接纹理的widget&#xff0c;你可以使用Texture widget。Texture widget用于显示视频或者画布&#xff08;canvas&#xff09;的内容。该组件只有唯一入参textureId 通过外接纹理的方式&…

迁移基于MicroBlaze处理器的设计

迁移基于MicroBlaze处理器的设计 生成系统基础设施&#xff08;MicroBlaze、AXI_Interconnect&#xff0c; Clk_Wiz、Proc_Sys_Reset&#xff09; 生成系统基础设施&#xff08;MicroBlaze、AXI_Interconnect、Clk_Wiz和 Proc_Sys_Reset&#xff09;&#xff1a; 1.使用所需的板…

2024年【危险化学品经营单位安全管理人员】考试报名及危险化学品经营单位安全管理人员找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试报名考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品经营单位安全管理人员找解析题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品经营单位安全管…

芋道源码 / yudao-cloud:前端技术架构探索与实践

摘要&#xff1a; 随着企业信息化建设的深入&#xff0c;后台管理系统在企业运营中扮演着至关重要的角色。本文将以芋道源码的yudao-cloud项目为例&#xff0c;深入探讨其前端技术架构的设计思路、关键技术与实现细节&#xff0c;并分享在开发过程中遇到的挑战与解决方案。 一、…