linux环形缓冲区kfifo剩余容量详解
有很多帖子说:out 始终不会大于 in,我想说未必吧,out可能会大于in,但是并不影响结果。
kfifo源码 fifo->size - fifo->in + fifo->out 是剩余容量,不管in和out谁大谁小,差值加上fifo->size一定是剩余容量。
原因是:三者(fifo->size、fifo->in、fifo->out)数据类型都是unsigned int,要溢出就一起溢出。
解释:
假设数据,
fifo->size = 32;
fifo->in = 2;
fifo->out = 42949672953;
那么,fifo->size - fifo->in + fifo->out的结果是,28。
快拿笔写下来几个知识点:
1.fifo->size,fifo->in,fifo->out 都为unsigned int 类型。
2.fifo->size必须是2的N次幂
3.smp_rmb和smp_mb是要有的,如果是单生产单消费类型可以去掉这个锁
4.当fifo->in == fifo->out 时,这俩同时置为0,这样再次put和out时,加的快
smp_mb
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步