最近做一个socket网络传输的项目,在使用TCP进行传输的时候,接收端有时候会因为写入到文件的时间而造成一定的延时,所以在接收端使用了ping-pong buffer的策略进行优化。
所谓ping-pong buffer,也就是定义两个buffer,当有数据进来的时候,负责写入buffer的进程就寻找第一个没有被占用而且可写的buffer,进行写入,写好之后,将占用flag释放,同时设置一个flag提示此buffer已经可读,然后再接下去找另外一个可写的buffer,写入新的数据。
而读入的进程也是一直对buffer状态进行检测,一旦发现没有被占用,而且已经可以被读,就把这个buffer的数据取出来,然后标志为可写。状态的转换关系如下:
status1:可写 full = false; occp = false;
这时候开始写入,同时改变状态:
status2: 正在写 full = false; occp = true;
写好之后buffer被释放:
status3: 写完了 full = true; occp = false;
而这个状态正是读入线程的开始状态,一旦开始读入,就改变状态
status4: 正在读 full = true; occp = true;
读完了之后:
status1 : full = false; occp = false;
又回到了可以写入的状态。
对于buffer的实现,选择循环链表的形式,一直进行循环检测:
typedef struct listBuf
{
char * buff;
int counter;
bool full;
bool occp;
struct listBuf* next;
}lBuf;
提供了创建循环链表和插入新的元素的函数:
void createBuf(lBuf ** rootP)
{
lBuf * tmp = *rootP;
tmp->counter = 0;
tmp->buff = new char[BLOCK_NUM*BUFFERSIZE];
tmp->next = tmp;
tmp->full = false;
tmp->occp = false;
}
void insertBuf(lBuf ** rootP)
{
lBuf * tmp = new lBuf();
tmp->counter = 0;
t