当前位置: 首页 > news >正文

fifo之读写指针

定义

写指针生产者。它的职责是“向哪里写入新数据”。它总是指向下一个可以写入数据的位置。写完一个数据后,它就向前移动一步,为下一次写入做准备。

读指针消费者。它的职责是“从哪里读取下一个数据”。它总是指向下一个将要被读取的数据的位置。读完一个数据后,它就向前移动一步,准备读取下一个。

缓冲区为空:当读指针和写指针指向同一个位置时,意味着“读指针已经追上了写指针”,所有数据都已被读取,没有新数据可读。这是“消费者”需要等待的状态。

缓冲区为满:当写指针绕了一圈,快要追上读指针时(具体实现上通常会留一个空格子作为判断标志),意味着所有格子都写满了数据,但没有被及时读取。此时“生产者”需要停止写入,否则会覆盖未读数据。这是“生产者”需要等待的状态。

为什么要用两个指针?(解决了什么问题)

使用读/写指针的核心目的是为了实现 生产者-消费者模型 下的异步处理解耦

  • 速度匹配:生产数据(写入)和消费数据(读取)的速度通常是不一致的。有时生产快,有时消费快。这个缓冲区就像一个“水库”,在洪峰时蓄水(生产快时存数据),在枯水时放水(消费快时提供数据),平滑了上下游的流量。

  • 避免等待:如果没有缓冲区,生产者必须等待消费者处理完当前数据才能提供下一个,反之亦然,效率极低。有了指针管理的缓冲区,双方可以连续工作,只要缓冲区不为空或不为满即可。

  • 线程安全:在多线程编程中,一个线程负责写入(操作写指针),另一个线程负责读取(操作读指针)。通过正确地管理这两个指针,可以高效地在线程间安全地传递数据,而无需复杂的锁机制(在某些无锁编程中)。

场景设定

假设我们有一个非常小的环形缓冲区,其长度为 6(即拥有 6 个存储格子,索引从 0 到 5)。
根据预留空间法,我们实际只能使用 5 个格子来存储数据,有 1 个格子被牺牲用于判断“满”状态。

操作序列Read PtrWrite Ptr缓冲区内容 (0-5)状态
1. 初始00[ _, _, _, _, _, _ ]
2. 写 ‘A’01[ A, _, _, _, _, _ ]有数据
3. 写 ‘B’,’C’,’D’,’E’05[ A, B, C, D, E, _ ]有数据
4. 尝试写 ‘F’05[ A, B, C, D, E, _ ] (拒绝写入)
5. 读 ‘A’15[ _, B, C, D, E, _ ]有数据
6. 读 ‘B’, ‘C’35[ _, _, _, D, E, _ ]有数据
7. 写 ‘F’, ‘G’31[ G, _, _, D, E, F ]有数据 (环绕)
8. 读 ‘D’,’E’,’F’,’G’11[ _, _, _, _, _, _ ]

文章转载自:

http://8PMUMZMI.bLqjf.cn
http://ymz8JsGx.bLqjf.cn
http://cQze33wS.bLqjf.cn
http://vEAJeFKP.bLqjf.cn
http://VvPB2zP4.bLqjf.cn
http://vIlRetwW.bLqjf.cn
http://9iBPtnU6.bLqjf.cn
http://nn95NfRm.bLqjf.cn
http://STW0tfHH.bLqjf.cn
http://r70vBSqe.bLqjf.cn
http://jeoibBpH.bLqjf.cn
http://Ynlg5uw9.bLqjf.cn
http://Naz5K50p.bLqjf.cn
http://LIbFa6Gz.bLqjf.cn
http://cXVmDR8c.bLqjf.cn
http://bMIGzTUR.bLqjf.cn
http://yBqxxyT4.bLqjf.cn
http://zbIPLxYJ.bLqjf.cn
http://rQYc6Brm.bLqjf.cn
http://oIpjI8vB.bLqjf.cn
http://gwxbe2Ix.bLqjf.cn
http://e2Z5y3Xt.bLqjf.cn
http://YRUOBH5v.bLqjf.cn
http://aiOmz41m.bLqjf.cn
http://XuihN3LX.bLqjf.cn
http://Ks8stewe.bLqjf.cn
http://UDQ1Qo2g.bLqjf.cn
http://7S7VvyC2.bLqjf.cn
http://7nmAdQZg.bLqjf.cn
http://II91zWgg.bLqjf.cn
http://www.dtcms.com/a/374755.html

相关文章:

  • 【第三次全国土壤普查】一键制备土壤三普环境变量23项遥感植被指数神器
  • Java反射机制详解
  • PDF文件中的广告二维码图片该怎么批量删除
  • 记一次 .NET 某中医药附属医院门诊系统 崩溃分析
  • WPF/Prism 中计算属性的通知机制详解 —— SetProperty 与 RaisePropertyChanged
  • jmeter使用指南
  • 硬件(六)arm指令
  • 后端错误处理的艺术:BusinessException 与 ResultUtils 的完美分工
  • MCU、CPLD、DSP、FPGA 有什么区别,该如何选择?
  • 【React Native】点赞特效动画组件FlowLikeView
  • android studio gradle 访问不了
  • 【C++】C++11 篇二
  • Kubernetes 配置检查与发布安全清单
  • Perforce Klocwork 2025.2版本更新:默认启用现代分析引擎、支持 MISRA C:2025 新规、CI构建性能提升等
  • 工业总线协议转换核心:SG-DP_MOD-110 Profibus-DP 转 Modbus-RTU 网关,打通异构设备数据链路
  • Win系统下配置PCL库第三步之链接库的路径(超详细)
  • 【远程运维】Linux 远程连接 Windows 好用的软件:MobaXterm 实战指南
  • Java入门级教程13-多线程同步安全机制synchronized(内置锁)、JavaMail发送电子邮箱、爬取CSDN到邮箱、备份数据库
  • 玩转Docker | 使用Docker部署KissLists任务管理工具
  • STL库——map/set(类函数学习)
  • STM32 串口接收数据包(自定义帧头帧尾)
  • 正向代理,反向代理,负载均衡还有nginx
  • 用户态与内核态的深度解析:安全、效率与优化之道
  • 搭建本地gitea服务器
  • ArcGIS JSAPI 高级教程 - 倾斜摄影数据开启透明(修改源码)
  • 输电线路分布式故障监测装置技术解析
  • 概率论第四讲—随机变量的数字特征
  • 学习stm32 蓝牙
  • 数据库学习MySQL系列2、Windows11系统安装MySQL方法一.msi安装详细教程
  • STM32物联网项目---ESP8266微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制---代码篇(四)