读书人

应用环形缓冲提升IO效率(无锁缓冲)

发布时间: 2013-08-01 15:23:18 作者: rapoo

使用环形缓冲提升IO效率(无锁缓冲)
#include "XRingBuffer.h"XRingBuffer::XRingBuffer(const DWORD size) :_size(size),_buffer(NULL),_write_pos(0),_read_pos(0),_state(eXRingBufferState_Empty){_buffer = new char[size];}XRingBuffer::~XRingBuffer(){delete [] _buffer;_buffer = NULL;}bool XRingBuffer::pushData(const char* data, const DWORD size){// 一定要先memcpy再设置writePos,读取也一样,要先有数据,才设置标志const DWORD freeSize = getFreeSize();if(size > freeSize){return false;}// 此处一定要先置state,如果把置state放在写指针增加完成后,有可能出现在置state之前,数据被读取空了,// 写指针和读指针相等,虽然读空时把state置为了Empty,但紧接着此处又错误地置为Full了。if(size == freeSize){_state = eXRingBufferState_Full;}if(_write_pos < _read_pos){assert(_read_pos - _write_pos >= size);memcpy_s(_buffer + _write_pos, _read_pos - _write_pos, data, size);_write_pos += size;}else{if(_write_pos + size > _size){// 尾部溢出// 先拷贝一部分长度到尾部,然后在从头开始拷贝DWORD wSize = _size - _write_pos;memcpy_s(_buffer + _write_pos, wSize, data, wSize);// 拷贝剩余部分到头部memcpy_s(_buffer, freeSize - wSize, data + wSize, size - wSize);_write_pos = size - wSize;}else{assert(_size - _write_pos >= size);memcpy_s(_buffer + _write_pos, freeSize, data, size);_write_pos = (_write_pos + size) % _size;}}return true;}bool XRingBuffer::copyData(char* dest, const DWORD destSize, const DWORD size){if(size > getUsedSize()){return false;}if(_read_pos + size > _size){// 到尾部还不够,需要再从头读// 先把尾部的拷进去DWORD wSize = _size - _read_pos;memcpy_s(dest, destSize, _buffer + _read_pos, wSize);// 拷贝头部的memcpy_s(dest + wSize, destSize - wSize, _buffer, size - wSize);}else {memcpy_s(dest, destSize, _buffer + _read_pos, size);}return true;}bool XRingBuffer::popData(char* dest, const DWORD destSize, const DWORD popSize){const DWORD usedSize = getUsedSize();if(popSize > usedSize){return false;}// 此处一定要先置state,原因参考pushData注释if(usedSize == popSize){_state = eXRingBufferState_Empty;}if(_read_pos + popSize > _size){// 到尾部还不够,需要再从头读// 先把尾部的拷进去DWORD wSize = _size - _read_pos;memcpy_s(dest, destSize, _buffer + _read_pos, wSize);// 拷贝头部的memcpy_s(dest + wSize, destSize - wSize, _buffer, popSize - wSize);_read_pos = popSize - wSize;}else {memcpy_s(dest, destSize, _buffer + _read_pos, popSize);_read_pos = (_read_pos + popSize) % _size;}return true;}bool XRingBuffer::popData(const DWORD popSize){const DWORD usedSize = getUsedSize();if(popSize > usedSize){return false;}// 此处一定要先置state,原因参考pushData注释if(usedSize == popSize){_state = eXRingBufferState_Empty;}if(_read_pos + popSize > _size){// 到尾部还不够,需要再从头读DWORD wSize = _size - _read_pos;_read_pos = popSize - wSize;}else {_read_pos = (_read_pos + popSize) % _size;}return true;}const DWORD XRingBuffer::getUsedSize() const{return _size - getFreeSize();}const DWORD XRingBuffer::getFreeSize() const{if(_write_pos == _read_pos){if(_state == eXRingBufferState_Empty){return _size;}else{return 0;}}else if(_write_pos < _read_pos){return _read_pos - _write_pos;}else {return _size - (_write_pos - _read_pos);}}

?

读书人网 >编程

热点推荐