Linux C++循环缓冲区模板类(2)

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

这个循环缓冲队列大体的功能已经实现,其中循环缓冲队列一些其他操作并没有去实现,只是描述了一些核心的操作!

如果有错误和其他意见,提出来大家一起相互讨论和学习!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/849a5a262e0fb9ac64db8daac78f231b.html