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
原文地址:https://www.cnblogs.com/workharder/p/12660311.html