FIFO批量取出后无法原位放回,先进入暂存区等待下一次消费
痛点:从队列取出后,这批数据还不能丢
发送链路里常见这样一条路径:协议栈把待发数据写入 FIFO;发送模块按批取出,交给串口、总线或对端;发送完成或收到对端确认之前,这批数据可能还要重发。
问题来了:read / pop 取出后,读指针已经前进,数据离开 FIFO。发送还没确认成功时,数据不能丢;但队列还在继续收新数据。这批「正在路上」的数据该放哪?
写回 FIFO 只能追加到队尾
普通 FIFO 只有队尾追加,没有「插回原位」。
举例:队列里是 A、B、C、D。取出 A、B 发送后,队列只剩 C、D。发送还没确认时,协议栈又写入 E、F,队列变成 C、D、E、F。
此时把 A、B 写回,结果是 C、D、E、F、A、B。原本更早的数据跑到了新数据后面,顺序已经错了。所以「取出后若失败就塞回队列」这条路走不通。
确认前这批数据必须保留
正在发送的那批,丢不得。
发送成功或对端确认之前,消费者手里必须一直握着这批数据。确认之后才能丢弃。否则超时重发时会发现:数据已经不在了。
MQTT 的发布确认(PUBACK)是同一类事:发送方先在本地暂存,收到对端确认后再删除。核心就一句:发出不等于完成;确认前要能重来。
消费者暂存区接管当前批次
确认前数据要能重来,又不能写回 FIFO,只能放在队列外面。
消费者在取出时立刻把当前批次放进自己的暂存区,再交给发送路径。FIFO 照常接收 E、F,和暂存区互不干扰。
下一次消费(发送成功、收到确认)发生后,才清空暂存区,再从 FIFO 取下一批。在此之前暂存区保持不变。释放只决定暂存区何时清空,不回退读指针,也不把数据送回队列。
本文由 AI 辅助生成,可能存在错误或遗漏,请以实际资料和官方文档为准。