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