多线程的队列循环缓存

应用场景

程序开发中经常遇到一种情况:一个线程收数据(例如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();






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值