DataBuffer.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #ifndef DATABUFFER_H
  2. #define DATABUFFER_H
  3. #include <vector>
  4. #include <mutex>
  5. #include <condition_variable>
  6. // ...existing code...
  7. template <typename T>
  8. class MemoryPool
  9. {
  10. public:
  11. MemoryPool(size_t size);
  12. template <typename... Args>
  13. MemoryPool(size_t size, Args &&...args)
  14. {
  15. for (size_t i = 0; i < size; ++i)
  16. {
  17. T *obj = new T(std::forward<Args>(args)...);
  18. pool.push_back(obj);
  19. }
  20. }
  21. ~MemoryPool();
  22. T *acquire();
  23. void release(T *obj);
  24. private:
  25. std::vector<T *> pool;
  26. std::mutex mtx;
  27. std::condition_variable cv;
  28. };
  29. // ...existing code...
  30. // ...existing code...
  31. template <typename T>
  32. MemoryPool<T>::MemoryPool(size_t size)
  33. {
  34. for (size_t i = 0; i < size; ++i)
  35. {
  36. pool.push_back(new T());
  37. }
  38. }
  39. template <typename T>
  40. MemoryPool<T>::~MemoryPool()
  41. {
  42. for (T *obj : pool)
  43. {
  44. delete obj;
  45. }
  46. }
  47. template <typename T>
  48. T *MemoryPool<T>::acquire()
  49. {
  50. std::unique_lock<std::mutex> lock(mtx);
  51. cv.wait(lock, [this]
  52. { return !pool.empty(); });
  53. T *obj = pool.back();
  54. pool.pop_back();
  55. return obj;
  56. }
  57. template <typename T>
  58. void MemoryPool<T>::release(T *obj)
  59. {
  60. std::unique_lock<std::mutex> lock(mtx);
  61. pool.push_back(obj);
  62. cv.notify_one();
  63. }
  64. // ...existing code...
  65. #endif // DATABUFFER_H