环形缓冲区(1)

2023-11-16

为什么要使用环形缓冲区?

认识环形缓冲区以及实现原理1

环形缓冲区实现原理2

再来认识一下环形缓冲区

环形缓冲区

环形缓冲区总结

  1. 避免频繁的内存创建取消、分配。内存一直只用了一块
  2. 在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问

在这里插入图片描述

环形缓冲区的几个基本操作

在这里插入图片描述

如何申请内存空间呢?

申请内存空间

  • 这里定义一个数组,数组的大小有自己来决定
    在这里插入图片描述

接下来就要对这个数组进行读写操作了,先看看写操作。

写操作

既然是要写操作,就要知道写的地址,

  • 这里的pW就是我们定义的写地址,最开始是指向零地址的

在这里插入图片描述

  • 这里每写入一个地址,指向的地址就会增加一个

在这里插入图片描述
但是这里需要考虑到一个问题,当我们的pW为7的时候,这时候就会越界,这是不允许的,

想想可以用这种方法一般的用法是 if(++size==BUFFER_SIZE) size=0;
当越界时候,又从头开始

下面推荐一种方法

在这里插入图片描述

这种写法更加好一点,当pW=7的时候,(pW+1)% 8 =0,如下所示
在这里插入图片描述

读操作

读操作和写操做是一样的
在这里插入图片描述

环形缓冲区小结

环形缓冲区有四个要素,宏定义除外把这三个要素定义在结构体里
在这里插入图片描述
在读写操作的时候需要判断我们的缓冲区是否为空或者是否为满,如何判断呢???

判断缓冲区是否为空

假设我们写了四个数据,这时候pW等于4
在这里插入图片描述

假如我们读取了这四个数据,这时候就没有要读取的数据了,环形缓冲区的数据为空,这时候pR=pW=4;所以,只需要判断环形缓冲区读写地址是否相同就可以判断环形缓冲区里面是否为空------------pR==pW;则为空

在这里插入图片描述

判断缓冲区是否写满

假设当我们在写到第七位的时候,再写一位,这时候,pw=pR这时候为空???,但是这时候已经是写满了,找到一种合适的计算方法就是:(pW+1)%BUFFER_SIZE == pR 当满足这个条件的时候,就证明已经写满了,将要写的数据丢弃掉

在这里插入图片描述

接下来开始写环形缓冲区:

构建环形缓冲区

在.h文件中声明结构体

在这里插入图片描述

在.c文件中定义函数

初始化环形缓冲区

缓冲区最开始无读写数据,都指向0
在这里插入图片描述

写缓冲区

需要满足条件时候才写,写满了不操作,丢弃掉
在这里插入图片描述

读缓冲区

这里也有限制条件,缓冲区有数据的时候才读
在这里插入图片描述

这里就三个函数,把这三个函数声明在.h文件中声明,以便别的函数调用。

构建环形缓冲区这两个文件放在仓库了

下载地址:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

环形缓冲区(1) 的相关文章

  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置
  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • Junit:如何测试从属性文件读取属性的方法

    嗨 我有课ReadProperty其中有一个方法ReadPropertyFile返回类型的Myclass从属性文件读取参数值并返回Myclass目的 我需要帮助来测试ReadPropertyFile方法与JUnit 如果可能的话使用模拟文件
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn

随机推荐

  • nim游戏 C++

    如果堆中石头的数量 nn 不能被 44 整除 那么你总是可以赢得 Nim 游戏的胜利 class Solution public bool canWinNim int n if n lt 0 return 0 else return n 4
  • 头插法和尾插法的详细区别

    浅析线性表 链表 的头插法和尾插法的区别及优缺点 线性表作为数据结构中比较重要的一种 具有操作效率高 内存利用率高 结构简单 使用方便等特点 今天我们一起交流一下单向线性表的头插法和尾插法的区别及优缺点 线性表因为每个元素都包含一个指向下一
  • IDE0006 加载项目时遇到了错误,已禁用了某些项目功能,例如用于失败项目和依赖于失败项目的其他项目的完整解决方案分析。

    重新打开vs2017就好了 原因猜测 vs来大姨妈了 现象是catch ex 后面是e message 单纯少个x vs没检测出来 辛辛苦苦搜个半天 可能太依赖vs了 懒人专属编辑器
  • npm私有化docker方式部署及使用说明

    一 部署nexus 本文采用docker方式部署nexus 安装docker yum install y docker 拉取nexus镜像 docker pull sonatype nexus3 准备本地映射目录 以便本地化持续存储数据 目
  • python No module named numpy. distutils._msvccompiler in numpy. distutils; trying from distutils

    在cmd 中输入 python setup py install 报错 No module named numpy distutils msvccompiler in numpy distutils trying from distutil
  • Android 报错 : FATAL EXCEPTION:main 解决方法

    今天安卓开发课上碰到的新问题 前景提示 老师让我们自己试一下那个两个页面跳转的效果 于是我就开始写了 然后报错 解决方法 逐一排查 首先要看你mainfest xml里面有没有增加Activity 当然我是加了 但是他还报错 具体代码界面
  • Ubuntu18.04 windows10双系统安装解决grub引导问题

    最近给服务器的电脑升级了ubuntu18 直接用u盘安装 老是说grub引导问题 网上有很多教程真的坑人 说的含含糊糊的 不知道在卖弄什么关子 我参照这两个教程解决了安装问题 十分钟就装好了 感谢你们 https blog csdn net
  • vue Tesseract的 ocr 文字识别

    npm结果页 https www npmjs com package tesseract js tesseract官网地址 https tesseract projectnaptha com npm结果页 npm结果页 tesseract官
  • 如何优雅的统计代码耗时

    点击上方 小强的进阶之路 选择 星标 公众号 优质文章 及时送达 预计阅读时间 16分钟 作者 Jitwxs 原文链接 底部链接可直达 https jitwxs cn 5aa91d10 html 一 前言 代码耗时统计在日常开发中算是一个十
  • R语言—列表

    文章目录 列表 定义 创建列表 List 列表 List 元素的引用 列表 List 元素的修改 访问列表元素和值 去列表化 在列表上使用apply系列函数 递归型列表 列表 R语言的6种模式 向量 矩阵 数组 数据框 列表 因子 向量 矩
  • SQLite如何删除,修改、重命名列

    今天在SQLite数据库中添加了一列 后来发现列名写错了 于是使用SQL语句来修改列名 可是根本不管用 首先 请放弃alter吧 sqlite官方说明如下 SQLite supports a limited subset of ALTER
  • 【JS】JavaScript时间与时间戳相互转换

    时间与时间戳相互转换 1 2 时间 JS常用时间类型 1 2 1 GMT 格林尼治标准时 1 2 2 UTC 协调世界时 1 2 3 中国标准时间 1 2 4 ISO8601标准时间格式 1 2 5 时间戳 timestamp 1 时间戳转
  • spring boot项目自动加载引入外部bean

    前言 spring boot项目简化了对外部项目的引入 使我们能够狠方便的构建一个web项目 我们通常在开发的过程中会开发出一些公用的模块组件 这样在项目找那个引入后能够直接使用 减少了轮子的重复构造 同时服务引入的模块化操作 能够更多的节
  • CV学习:OpenCv快速入门(python版)

    本文代码全部可运行 笔者运行环境 python3 7 pycharm opencv4 6 此文是学习记录 记录opencv的入门知识 对各知识点并不做深入探究 文章的目的是让阅读者在极短的时间达到入门水平 在学习过程中 我们应养成 查询op
  • pygame用blit()实现动画效果

    pygame的的实现动画的方法有很多 但是都是围绕着表面进行的 也就是说实现动画的方式不同 但是本质其实都是对表面的不同处理方式而已 原理其实很简单 有点像我们做地铁的时候隧道里的广告一样 我们设置一个窗口 然后让窗口在一个画着很多帧图像的
  • 约束综合中的逻辑互斥时钟(Logically Exclusive Clocks)

    注 本文翻译自Constraining Logically Exclusive Clocks in Synthesis 逻辑互斥时钟的定义 逻辑互斥时钟是指设计中活跃 activate 但不彼此影响的时钟 常见的情况是 两个时钟作为一个多路
  • IDEA从安装到使用--相关配置详解

    IDEA从安装到使用 相关配置详解 作为一个技术小白 刚开始学习使用Intellij IDEA 入门时踩了很多的坑 这里写下我的第一篇博客 分享相关IDEA的配置方法 希望能为各位提供一点帮助 IDEA2018安装及破解 作者 志哥的成长笔
  • 大数(四则运算)

    四则运算 大数加法 高精度加法 大数减法 大数乘法 大数乘法 幂运算 大数乘法 高精度幂运算 大数除法 大数加法 思路 从后往前算 即由低位向高位运算 计算的结果依次添加到结果中去 最后将结果字符串反转 输入的时候两个数都是以字符串的形式输
  • 网站架构演变

    网站架构演变 大型网站介绍 与传统企业应用系统相比 大型互联网网站系统具有以下特点 1 大流量 高并发 这一点往往是传统企业应用系统根本就不会遇到的问题 比如Goole每日访问量都是几十亿 如果服务器端处理不好早就被压的宕机了 2 高可用
  • 环形缓冲区(1)

    声明 参考韦东山视频教程 如若侵权请告知 马上删帖致歉 个人总结 如有不对 欢迎指正 环形缓冲区 环形缓冲区的几个基本操作 申请内存空间 写操作 读操作 环形缓冲区小结 判断缓冲区是否为空 判断缓冲区是否写满 构建环形缓冲区 在 h文件中声