循环缓冲区1循环缓冲区在一些竞争问题上提供了一种免锁的机制,免锁的前提是,生产者和消费2都只有一个的情况下,否则也要加锁。下面就内核中提取出来,而经过修改后的fifo进3行简要的分析。45先看其只要数据结构:6structmy_fifo{7unsignedchar*buffer;/*thebufferholdingthedata*/8unsignedintsize;/*thesizeoftheallocatedbuffer*/9unsignedintin;/*dataisaddedatoffset(in%size)*/10unsignedintout;/*dataisextractedfromoff.(out%size)*/11};12也不用多说,一看就明白。size,in,out都设成无符号型的,因为都不存在负值的情13型。1415/*16formkernel/*/1819#include<>20#include<>21#include<>2223#definemin(a,b)((a)<(b)?(a):(b))24/*25my_fifo_init26*/27structmy_fifo*my_fifo_init(unsignedchar*buffer,unsignedintsize)28{29structmy_fifo*fifo;303132fifo=malloc(sizeof(structmy_fifo));33if(!fifo)34returnNULL;3536fifo->buffer=buffer;37fifo->size=size;38fifo->in=fifo->out=0;3940returnfifo;41}42这个初始化fifo结构的函数一般也不会在应用层里进行调用,而是被下面的fifo_alloc43调用。依我的观点来看,这两个函数合成一个函数会更加的清晰,但是这一情况只针对buffer是系统开辟的空间,如果buffer的空间是由其它的函数来提供,就只能用上面的这个函数。44/*45my_fifo_alloc46*/47structmy_fifo*my_fifo_alloc(unsignedintsize)48{49unsignedchar*buffer;50structmy_fifo*ret;5152/*53*rounduptothenextpowerof2,sinceour'lettheindices54*wrap'*/5657buffer=malloc(size);58if(!buffer)59returnNULL;6061ret=my_fifo_init(buffer,size);6263if(ret==NULL)64free(buffer);6566returnret;67}68/*69*my_fifo_free70*/71voidmy_fifo_free(structmy_fifo*fifo)72{73free(fifo->buffer);74free(fifo);75}7677这两个函数也不作过多的分析,都很清晰。78/*79my_fifo_put()80*/81unsignedintmy_fifo_
循环缓冲区 来自淘豆网m.daumloan.com转载请标明出处.