return false;
}
//当条件不满足的时候,说明缓冲区已满,Push进来的数据就会丢失
if(_write < _read + _size){
//我们这里存入的是type指针,这个指针指向了一个我们分配的内存空间或者类
_queue[_write & _mask] = type;
_write++;
return true;
}
return false;
}
T *Pop(){
T *tmp = NULL;
//当条件不满足的时候说明缓冲区已经没有数据
if(_read < _write){
//取出队列的数据
tmp = _queue[_read & _mask];
_read++;
}
return tmp;
}
int GetRemainSize(){
return (_write - _read);
}
};
下面是简单的测试代码:
//main.cpp
#include <iostream>
#include <pthread.h>
#include "CRecycleQueue.h"
using namespace std;
class UserInfo{
private :
int _num;
public:
UserInfo(int num){
_num = num;
}
int getUserNum(){
return _num;
}
};
CRecycleQueue<UserInfo> *queue = new CRecycleQueue<UserInfo>;
void *write_func(void *args){
int num = 0;
while(1){
//UserInfo里可以封装你自己想要的数据
//这里仅仅是一个简单的测试用例
UserInfo *info = new UserInfo(num++);
if(!queue->Push(info)){
//Push失败 删除手动分配的内存空间
delete info;
}
sleep(1);
}
}
void *read_func(void *args){
while(1){
UserInfo *info = NULL;
if(info = queue->Pop()){
cout<<info->getUserNum()<<endl;
delete info;
}
sleep(1);
}
}
int
main(){
queue->InitRecycleQueue(8);
pthread_t pid1;
pthread_t pid2;
//这种生产者和消费者都只有一个的情况下,这个循环缓冲区为竞争问题提供了免锁,大大提高了程序的处理效率
pthread_create(&pid1,NULL,read_func,NULL);
pthread_create(&pid2,NULL,write_func,NULL);
pthread_join(pid1,NULL);
pthread_join(pid2,NULL);
return 0;
}
编译:g++ main.cpp -lpthread -o test
这个循环缓冲队列大体的功能已经实现,其中循环缓冲队列一些其他操作并没有去实现,只是描述了一些核心的操作!
如果有错误和其他意见,提出来大家一起相互讨论和学习!