DataCache.h
Go to the documentation of this file.
1 /*******************************************************************
2  * 简介: 通过ReaderWriterQueue队列实现的缓冲区,线程安全
3  * 名称: DataCache.h、DataCache.cpp
4  * 创建时间: 2019年12月6号
5  * 修改时间: 2019年12月9号 完善代码逻辑
6  * *****************************************************************/
7 #pragma once
8 
9 #include <vector>
10 #include "readerwriterqueue.h"
11 #include <exception>
12 #include "CommonDefine.h"
13 
14 namespace NS_DataCache
15 {
16  using namespace moodycamel;
17 
18 #define DATA_CACHE_MAX_SIZE 100 //一个缓冲区最多有100条队列,可更改
19 #define DATA_CACHE_QUEUE_MAX_SIZE 500 //一个队列中最大缓存500条数据,可更改
20 
21  //缓冲区
22  template<class T>
23  class DataCache
24  {
25  private:
26  std::vector<BlockingReaderWriterQueue<T>>* m_pDataCache;//为了处理方便,使用vector
27 
28  public:
29  //构造函数
31  {
32  m_pDataCache = new std::vector<BlockingReaderWriterQueue<T>>();
33  }
34  //析构函数
36  {
37  if (nullptr != m_pDataCache)
38  {
39  delete m_pDataCache;
40  m_pDataCache = nullptr;
41  }
42  }
43  //获取缓冲区大小
44  int32_t GetSize()
45  {
46  return m_pDataCache->size();
47  }
48  //向缓冲区中加入一个队列,返回这个队列在缓冲区中的索引
49  int32_t ExpandDataCacheSize(int32_t& iIndex)
50  {
51  //扩容,容量校验
52  if (m_pDataCache->size() < DATA_CACHE_MAX_SIZE)
53  {
54  try
55  {
56  iIndex = m_pDataCache->size();
57  m_pDataCache->resize(iIndex + 1);
58  }
59  catch (std::exception e)
60  {
61  printf("ERROR:缓冲区扩容失败,%s\n",e.what());
62  return RET_ERROR;
63  }
64  }
65  else
66  {
67  printf("ERROR:缓冲区扩容失败,超过最大缓冲区限制!\n");
68  }
69  return RET_SUCCESS;
70  }
71  //通过Index向缓冲区入队一帧数据
72  int32_t InsertDataByIndex(T inputValue, int32_t i32BufferIndex)//由于每个线程的Index不同,线程安全
73  {
74  //入参校验
75  if (i32BufferIndex < 0 || i32BufferIndex >= m_pDataCache->size())
76  {
77  printf("ERROR:向缓冲区存放数据失败,入参校验未通过!\n");
78  return RET_ERROR;
79  }
80  if (!m_pDataCache->at(i32BufferIndex).enqueue(inputValue))//入队
81  {
82  printf("ERROR:向缓冲区存放数据失败,向第%d个队列中入队时失败!\n", i32BufferIndex);
83  return RET_ERROR;
84  }
85  return RET_SUCCESS;
86  }
87  //通过Index缓冲区出队一帧数据,内存由本函数申请
88  int32_t GetDataByIndex(int32_t i32BufferIndex, T &outputValue)
89  {
90  //入参校验
91  if (i32BufferIndex < 0 || i32BufferIndex >= m_pDataCache->size())
92  {
93  printf("ERROR:从缓冲区获取数据失败,入参校验未通过!\n");
94  return RET_ERROR;
95  }
96  //出队
97  try
98  {
99  m_pDataCache->at(i32BufferIndex).wait_dequeue(outputValue);//出队,等待出队,ReaderWriteQueue中的机制,可以实现等待队列中存在完整数据后再出队,否则阻塞
100  }
101  catch(...)
102  {
103  printf("ERROR:从缓冲区获取数据失败,出队失败!\n");
104  return RET_ERROR;
105  }
106  return RET_SUCCESS;
107  }
108  };
109 };//namespace DataCache
std::vector< BlockingReaderWriterQueue< T > > * m_pDataCache
Definition: DataCache.h:26
int32_t GetDataByIndex(int32_t i32BufferIndex, T &outputValue)
Definition: DataCache.h:88
#define DATA_CACHE_MAX_SIZE
Definition: DataCache.h:18
int32_t InsertDataByIndex(T inputValue, int32_t i32BufferIndex)
Definition: DataCache.h:72
int32_t ExpandDataCacheSize(int32_t &iIndex)
Definition: DataCache.h:49


orb_slam2_with_maps_odom
Author(s): teng zhang
autogenerated on Fri Sep 25 2020 03:24:47