环形缓冲区

来源:互联网 发布:网络mg老虎机骗局 编辑:程序博客网 时间:2024/04/28 22:10

        环形缓冲区。我的理解就是,开辟一块内存区域,然后会有操作不断地往里边存放数据,同时也会有操作从这块区域里边往外拿数据。主要用在网络编程中,数据接收线程接收客户端发送过来的数据,先存放到环形缓冲区中,然后数据处理线程再从里边逐条读取数据并处理。实现的重点有两点:1、保证存放数据的时候不会覆盖还未读取的数据、读取数据的时候不会重复读取已经读取过的数据;2、线程同步。

        下面是我实现的一个简单的环形缓冲区代码:

#ifndef __rbuf_h__#define __rbuf_h__#include <Windows.h>class RBuf{public:RBuf( int sz );~RBuf();boolinit();boolinitOk();boolempty();boolfull();boolread( char *data, int len );boolwrite( const char *data, int len );voiddestroy();private:CRITICAL_SECTIONm_cs;intm_sz;intm_rpos;intm_wpos;char*m_buf;boolm_bOk;};#endif // __rbuf_h__

#include "rbuf.h"RBuf::RBuf( int sz ): m_sz( sz ), m_rpos( 0 ), m_wpos( 0 ), m_buf( NULL ), m_bOk( false ){InitializeCriticalSection( &m_cs );init();}RBuf::~RBuf(){destroy();DeleteCriticalSection( &m_cs );}bool RBuf::init(){destroy();EnterCriticalSection( &m_cs );m_buf = new char[m_sz];if( NULL == m_buf )m_bOk = false;else {memset( m_buf, 0, sizeof(char) * m_sz );m_bOk = true;m_rpos = 0;m_wpos = 0;}LeaveCriticalSection( &m_cs );return m_bOk;}void RBuf::destroy(){EnterCriticalSection( &m_cs );if( NULL != m_buf ) {delete []m_buf;m_buf = NULL;}LeaveCriticalSection( &m_cs );}bool RBuf::initOk(){return m_bOk;}bool RBuf::empty(){bool bret = false;EnterCriticalSection( &m_cs );if( m_rpos == m_wpos )bret = true;LeaveCriticalSection( &m_cs );return bret;}bool RBuf::full(){bool bret = false;EnterCriticalSection( &m_cs );if( (m_wpos + 1) == m_rpos )bret = true;else if( (m_rpos == 0) && (m_wpos == (m_sz - 1)) )bret = true;LeaveCriticalSection( &m_cs );return bret;}bool RBuf::read( char *data, int len ){if( empty() )return false;bool bret = false;EnterCriticalSection( &m_cs );if( m_rpos < m_wpos ) {if( m_wpos - m_rpos < len )bret = false;else {memcpy( data, m_buf + m_rpos, len );m_rpos += len;bret = true;}}else {if( m_sz - m_rpos >= len ) {memcpy( data, m_buf + m_rpos, len );m_rpos += len;if( m_rpos == m_sz )m_rpos = 0;bret = true;}else {int len1 = m_sz - m_rpos;if( m_wpos + len1 >= len ) {memcpy( data, m_buf + m_rpos, len1 );memcpy( data + len1, m_buf, len - len1 );m_rpos = len - len1;bret = true;}elsebret = false;}}LeaveCriticalSection( &m_cs );return bret;}bool RBuf::write( const char *data, int len ){if( full() )return false;bool bret = false;EnterCriticalSection( &m_cs );if( m_wpos < m_rpos ) {if( m_rpos - m_wpos < len )bret = false;else {memcpy( m_buf + m_wpos, data, len );m_wpos += len;bret = true;}}else {if( m_sz - m_wpos >= len ) {memcpy( m_buf + m_wpos, data, len );m_wpos += len;if( m_wpos == m_sz )m_wpos = 0;bret = true;}else {int len1 = m_sz - m_wpos;if( m_rpos + len1 > len ) {memcpy( m_buf + m_wpos, data, len1 );memcpy( m_buf, data + len1, len - len1 );m_wpos = len - len1;bret = true;}elsebret = false;}}LeaveCriticalSection( &m_cs );return bret;}

        下面是简单的测试代码以及测试结果:

#include "rbuf.h"#include <stdio.h>#include <time.h>#include <string>using namespace std;typedef enum _em_data_type {dtInt,dtStr,dtSt,dtCount} DataType;typedef struct _st_data_header {DataTypedt;intlen;} DataHeader;typedef struct _st_st {charc;floatf;chars[128];} St;DWORD WINAPI readProc( LPVOID param );DWORD WINAPI writeProc( LPVOID param );bool readData( RBuf *pbuf );bool writeData( RBuf *pbuf, DataType dt );int main( void ){RBuf rbuf( 1024 );if( !rbuf.initOk() ) {printf( "init rbuf failed\r\n" );return -1;}elseprintf( "init rbuf success\r\n" );HANDLE hWrite = CreateThread( NULL, 0, writeProc, &rbuf, 0, NULL );if( NULL == hWrite ) {printf( "create write thread failed\r\n" );return -1;}Sleep( 10 );HANDLE hRead = CreateThread( NULL, 0, readProc, &rbuf, 0, NULL );if( NULL == hRead ) {printf( "create read thread failed\r\n" );CloseHandle( hWrite );return -1;}WaitForSingleObject( hWrite, INFINITE );WaitForSingleObject( hRead, INFINITE );return 0;}DWORD WINAPI writeProc( LPVOID param ){srand( (unsigned)time(NULL) );RBuf *pbuf = (RBuf*)param;for( int i = 0; i < 128; i++ ) {writeData( pbuf, (DataType)(i % dtCount) );Sleep( 1 );}return 0;}DWORD WINAPI readProc( LPVOID param ){RBuf *pbuf = (RBuf*)param;int count = 0;while( 1 ) {if( count > 5 )break;if( readData(pbuf) ) {count = 0;Sleep( 1 );}else {count++;Sleep( 10 );}}return 0;}bool writeData( RBuf *pbuf, DataType dt ){if( NULL == pbuf )return false;intvalueInt= rand();charvalueStr[128]= { 0 };StvalueSt= { 0 };DataHeader header;header.dt = dt;switch( dt ){case dtInt:header.len = sizeof( int );break;case dtStr:{sprintf_s( valueStr, 128, "dtStr make random data %d", valueInt );header.len = strlen(valueStr) + 1;}break;case dtSt:{valueSt.c = rand() % 26 + 'a';valueSt.f = (float)valueInt / 10;sprintf_s( valueSt.s, 128, "dtSt make random data %d", valueInt );header.len = sizeof( St );}break;default:printf( "write data get incorrect data type\r\n" );return false;}char *data = new char[sizeof(DataHeader) + header.len];memcpy( data, &header, sizeof(DataHeader) );switch( dt ) {case dtInt:memcpy( data + sizeof(DataHeader), &valueInt, header.len );break;case dtStr:memcpy( data + sizeof(DataHeader), &valueStr, header.len );break;case dtSt:memcpy( data + sizeof(DataHeader), &valueSt, header.len );break;}if( !pbuf->write(data, sizeof(DataHeader) + header.len) ) {printf( "write data failed\r\n" );delete []data;return false;}else {switch( dt ) {case dtInt:printf( "write dtInt data: %d\r\n", valueInt );break;case dtStr:printf( "write dtStr data: %s\r\n", valueStr );break;case dtSt:printf( "write dtSt data: %c, %f, %s\r\n", valueSt.c, valueSt.f, valueSt.s );break;}delete []data;return true;}}bool readData( RBuf *pbuf ){if( NULL == pbuf )return false;DataHeader header;if( !pbuf->read((char*)&header, sizeof(DataHeader)) )return false;char *data = new char[header.len];if( !pbuf->read(data, header.len) ) {delete []data;return false;}switch( header.dt ) {case dtInt:printf( "read dtInt data: %d\r\n", *((int*)data) );break;case dtStr:printf( "read dtStr data: %s\r\n", data );break;case dtSt:{St *pst = (St*)data;printf( "read dtSt data: %c, %f, %s\r\n", pst->c, pst->f, pst->s );}break;default:printf( "read unknown data\r\n" );}delete []data;return true;}

init rbuf successwrite dtInt data: 20471write dtStr data: dtStr make random data 14713write dtSt data: y, 1013.099976, dtSt make random data 10131write dtInt data: 19480write dtStr data: dtStr make random data 13095write dtSt data: d, 3112.600098, dtSt make random data 31126read dtInt data: 20471write dtInt data: 5836read dtStr data: dtStr make random data 14713write dtStr data: dtStr make random data 16262read dtSt data: y, 1013.099976, dtSt make random data 10131write dtSt data: a, 3181.699951, dtSt make random data 31817read dtInt data: 19480write dtInt data: 400read dtStr data: dtStr make random data 13095write dtStr data: dtStr make random data 15085read dtSt data: d, 3112.600098, dtSt make random data 31126write dtSt data: m, 2668.300049, dtSt make random data 26683read dtInt data: 5836write dtInt data: 15743read dtStr data: dtStr make random data 16262write dtStr data: dtStr make random data 9180read dtSt data: a, 3181.699951, dtSt make random data 31817write dtSt data: f, 1957.599976, dtSt make random data 19576read dtInt data: 400write dtInt data: 20515read dtStr data: dtStr make random data 15085write dtStr data: dtStr make random data 3206read dtSt data: m, 2668.300049, dtSt make random data 26683write dtSt data: y, 1894.000000, dtSt make random data 18940read dtInt data: 15743write dtInt data: 19083read dtStr data: dtStr make random data 9180write dtStr data: dtStr make random data 17804read dtSt data: f, 1957.599976, dtSt make random data 19576write dtSt data: i, 906.900024, dtSt make random data 9069read dtInt data: 20515write dtInt data: 30365read dtStr data: dtStr make random data 3206write dtStr data: dtStr make random data 9740read dtSt data: y, 1894.000000, dtSt make random data 18940write dtSt data: e, 2996.100098, dtSt make random data 29961read dtInt data: 19083write dtInt data: 28334read dtStr data: dtStr make random data 17804write dtStr data: dtStr make random data 5338read dtSt data: i, 906.900024, dtSt make random data 9069write dtSt data: n, 1046.099976, dtSt make random data 10461read dtInt data: 30365write dtInt data: 21328read dtStr data: dtStr make random data 9740write dtStr data: dtStr make random data 14093read dtSt data: e, 2996.100098, dtSt make random data 29961write dtSt data: i, 3154.300049, dtSt make random data 31543read dtInt data: 28334write dtInt data: 4971read dtStr data: dtStr make random data 5338write dtStr data: dtStr make random data 26558read dtSt data: n, 1046.099976, dtSt make random data 10461write dtSt data: z, 905.500000, dtSt make random data 9055read dtInt data: 21328write dtInt data: 31376read dtStr data: dtStr make random data 14093write dtStr data: dtStr make random data 23820read dtSt data: i, 3154.300049, dtSt make random data 31543write dtSt data: u, 2982.600098, dtSt make random data 29826read dtInt data: 4971write dtInt data: 31113read dtStr data: dtStr make random data 26558write dtStr data: dtStr make random data 7779read dtSt data: z, 905.500000, dtSt make random data 9055write dtSt data: w, 279.899994, dtSt make random data 2799read dtInt data: 31376write dtInt data: 23861read dtStr data: dtStr make random data 23820write dtStr data: dtStr make random data 12287read dtSt data: u, 2982.600098, dtSt make random data 29826write dtSt data: r, 2291.800049, dtSt make random data 22918read dtInt data: 31113write dtInt data: 26515read dtStr data: dtStr make random data 7779write dtStr data: dtStr make random data 6059read dtSt data: w, 279.899994, dtSt make random data 2799write dtSt data: r, 1111.599976, dtSt make random data 11116read dtInt data: 23861write dtInt data: 32540read dtStr data: dtStr make random data 12287write dtStr data: dtStr make random data 7887read dtSt data: r, 2291.800049, dtSt make random data 22918write dtSt data: e, 2816.399902, dtSt make random data 28164read dtInt data: 26515write dtInt data: 26710read dtStr data: dtStr make random data 6059write dtStr data: dtStr make random data 30121read dtSt data: r, 1111.599976, dtSt make random data 11116write dtSt data: n, 2229.899902, dtSt make random data 22299read dtInt data: 32540write dtInt data: 15782read dtStr data: dtStr make random data 7887write dtStr data: dtStr make random data 7131read dtSt data: e, 2816.399902, dtSt make random data 28164write dtSt data: w, 1520.300049, dtSt make random data 15203read dtInt data: 26710write dtInt data: 6501read dtStr data: dtStr make random data 30121write dtStr data: dtStr make random data 12838read dtSt data: n, 2229.899902, dtSt make random data 22299write dtSt data: n, 1053.099976, dtSt make random data 10531read dtInt data: 15782write dtInt data: 9783read dtStr data: dtStr make random data 7131write dtStr data: dtStr make random data 6517read dtSt data: w, 1520.300049, dtSt make random data 15203write dtSt data: n, 695.599976, dtSt make random data 6956read dtInt data: 6501write dtInt data: 2456read dtStr data: dtStr make random data 12838write dtStr data: dtStr make random data 797read dtSt data: n, 1053.099976, dtSt make random data 10531write dtSt data: f, 2254.300049, dtSt make random data 22543read dtInt data: 9783write dtInt data: 23736read dtStr data: dtStr make random data 6517write dtStr data: dtStr make random data 22115read dtSt data: n, 695.599976, dtSt make random data 6956write dtSt data: n, 2087.699951, dtSt make random data 20877read dtInt data: 2456write dtInt data: 10121read dtStr data: dtStr make random data 797write dtStr data: dtStr make random data 3903read dtSt data: f, 2254.300049, dtSt make random data 22543write dtSt data: b, 622.299988, dtSt make random data 6223read dtInt data: 23736write dtInt data: 4630read dtStr data: dtStr make random data 22115write dtStr data: dtStr make random data 31327read dtSt data: n, 2087.699951, dtSt make random data 20877write dtSt data: e, 1429.599976, dtSt make random data 14296read dtInt data: 10121write dtInt data: 16406read dtStr data: dtStr make random data 3903write dtStr data: dtStr make random data 29295read dtSt data: b, 622.299988, dtSt make random data 6223write dtSt data: k, 376.700012, dtSt make random data 3767read dtInt data: 4630write dtInt data: 2753read dtStr data: dtStr make random data 31327write dtStr data: dtStr make random data 664read dtSt data: e, 1429.599976, dtSt make random data 14296write dtSt data: z, 3046.500000, dtSt make random data 30465read dtInt data: 16406write dtInt data: 3298read dtStr data: dtStr make random data 29295write dtStr data: dtStr make random data 4678read dtSt data: k, 376.700012, dtSt make random data 3767write dtSt data: m, 2124.600098, dtSt make random data 21246read dtInt data: 2753write dtInt data: 13614read dtStr data: dtStr make random data 664write dtStr data: dtStr make random data 32303read dtSt data: z, 3046.500000, dtSt make random data 30465write dtSt data: q, 2102.699951, dtSt make random data 21027read dtInt data: 3298write dtInt data: 21204read dtStr data: dtStr make random data 4678write dtStr data: dtStr make random data 17041read dtSt data: m, 2124.600098, dtSt make random data 21246write dtSt data: a, 57.599998, dtSt make random data 576read dtInt data: 13614write dtInt data: 20565read dtStr data: dtStr make random data 32303write dtStr data: dtStr make random data 6842read dtSt data: q, 2102.699951, dtSt make random data 21027write dtSt data: s, 25.100000, dtSt make random data 251read dtInt data: 21204write dtInt data: 4246read dtStr data: dtStr make random data 17041write dtStr data: dtStr make random data 14798read dtSt data: a, 57.599998, dtSt make random data 576write dtSt data: s, 2495.699951, dtSt make random data 24957read dtInt data: 20565write dtInt data: 8756read dtStr data: dtStr make random data 6842write dtStr data: dtStr make random data 197read dtSt data: s, 25.100000, dtSt make random data 251write dtSt data: g, 676.299988, dtSt make random data 6763read dtInt data: 4246write dtInt data: 15639read dtStr data: dtStr make random data 14798write dtStr data: dtStr make random data 21939read dtSt data: s, 2495.699951, dtSt make random data 24957write dtSt data: u, 412.000000, dtSt make random data 4120read dtInt data: 8756write dtInt data: 15946read dtStr data: dtStr make random data 197write dtStr data: dtStr make random data 76read dtSt data: g, 676.299988, dtSt make random data 6763write dtSt data: y, 383.299988, dtSt make random data 3833read dtInt data: 15639write dtInt data: 5641read dtStr data: dtStr make random data 21939write dtStr data: dtStr make random data 12199read dtSt data: u, 412.000000, dtSt make random data 4120write dtSt data: n, 1903.300049, dtSt make random data 19033read dtInt data: 15946write dtInt data: 23580read dtStr data: dtStr make random data 76write dtStr data: dtStr make random data 3394read dtSt data: y, 383.299988, dtSt make random data 3833write dtSt data: g, 1313.300049, dtSt make random data 13133read dtInt data: 5641write dtInt data: 32356read dtStr data: dtStr make random data 12199write dtStr data: dtStr make random data 327read dtSt data: n, 1903.300049, dtSt make random data 19033write dtSt data: j, 1533.900024, dtSt make random data 15339read dtInt data: 23580write dtInt data: 15796read dtStr data: dtStr make random data 3394write dtStr data: dtStr make random data 3085read dtSt data: g, 1313.300049, dtSt make random data 13133write dtSt data: d, 2322.300049, dtSt make random data 23223read dtInt data: 32356write dtInt data: 27874read dtStr data: dtStr make random data 327write dtStr data: dtStr make random data 22754read dtSt data: j, 1533.900024, dtSt make random data 15339write dtSt data: s, 2518.199951, dtSt make random data 25182read dtInt data: 15796write dtInt data: 9757read dtStr data: dtStr make random data 3085write dtStr data: dtStr make random data 28168read dtSt data: d, 2322.300049, dtSt make random data 23223write dtSt data: q, 42.299999, dtSt make random data 423read dtInt data: 27874write dtInt data: 27264read dtStr data: dtStr make random data 22754write dtStr data: dtStr make random data 7677read dtSt data: s, 2518.199951, dtSt make random data 25182write dtSt data: z, 3267.800049, dtSt make random data 32678read dtInt data: 9757write dtInt data: 24552read dtStr data: dtStr make random data 28168write dtStr data: dtStr make random data 7679read dtSt data: q, 42.299999, dtSt make random data 423write dtSt data: x, 209.899994, dtSt make random data 2099read dtInt data: 27264write dtInt data: 8451read dtStr data: dtStr make random data 7677write dtStr data: dtStr make random data 26064read dtSt data: z, 3267.800049, dtSt make random data 32678read dtInt data: 24552read dtStr data: dtStr make random data 7679read dtSt data: x, 209.899994, dtSt make random data 2099read dtInt data: 8451read dtStr data: dtStr make random data 26064请按任意键继续. . .


0 0
原创粉丝点击