多线程的队列循环缓存

来源:互联网 发布:win7网络0个对象 编辑:程序博客网 时间:2024/05/29 09:19

应用场景

程序开发中经常遇到一种情况:一个线程收数据(例如socket->recv),一个线程处理数据。

这种情况下,我通常的处理方式是一个公共的buff、一个锁,接收线程收到数据后,加锁拷贝内存记录偏移。另一个线程判断偏移大于零时呢,加锁,内存拷贝出来,然后处理。

这时就设计,需要加锁,如果高速数据接收(如万兆网),可能导致接收不及时丢包。

进而需要设计一种无锁的缓存

无锁缓存

思路

1.一个接收数据线程,一个处理数据线程

2.定义100个10M的缓存,每个缓存有一个枚举值状态,包括:空、在写入、在读取

3.这样的话,收数据线程,跟这个100个缓存的状态往里面写​,数据处理线程,根据100个缓存的状态处理

4.这样达到没有锁的效果​

具体的缓存个数,缓存大小可以根据实际需要定义。

缓存队列使用的话,应该顺序使用,到队列头部,然后从头开始,若缓存状态为在读入,那么说明处理数据太慢,数据处理不过来,应该有异常上报机制。


代码 

strcut{enum bufState{empty,writeing,reading;};buffState  st;char * buff;int offset;} buff;buff   buffQue[100];createBuffQue();





0 0