[关闭]
@lupnfer 2017-02-08T07:29:47.000000Z 字数 3260 阅读 873

对象池

Code

C++11 C++03 两个版本的资源池


C++11

这里 std::shared_ptr get_shared() TODO

  1. /**********************************************************************
  2. Product:
  3. Project:
  4. Created:
  5. Authors:
  6. Description: baseobjectpool
  7. -----------------------------------------------------------------------
  8. ChangeLog
  9. DATE NAME DESCRIPTION
  10. -----------------------------------------------------------------------
  11. 2016-9-22 hekai initial
  12. **********************************************************************/
  13. #ifndef WISEOS_COMMON_OBJECTPOOL_H_
  14. #define WISEOS_COMMON_OBJECTPOOL_H_
  15. #include <memory>
  16. #include <vector>
  17. #include <functional>
  18. #include "boost/thread.hpp"
  19. #include "wiseos/common/error.h"
  20. namespace ia10k {
  21. template < typename T >
  22. class BaseObjectPool {
  23. public:
  24. using DeleterType = std::function<void(T*)>;
  25. virtual void add(std::unique_ptr<T> t) {
  26. mutex_.lock();
  27. pool_.push_back(std::move(t));
  28. total++;
  29. mutex_.unlock();
  30. }
  31. virtual void sub() {
  32. mutex_.lock();
  33. if (pool_.size() == 0) {
  34. THROW_API_ERROR(IA_ERROR_NOTSUPPORT, 0, "there is no handle to sub", "");
  35. }
  36. pool_.pop_back();
  37. total_--;
  38. mutex_.unlock();
  39. }
  40. virtual std::unique_ptr<T, DeleterType> get() {
  41. if (pool_.empty()) {
  42. return nullptr;
  43. }
  44. if (total == 0) {
  45. THROW_API_ERROR(IA_ERROR_NOTSUPPORT, 0, "this type handle is not exist", "");
  46. }
  47. std::unique_ptr<T, DeleterType> ptr(pool_.back().release(), [this](T* t) {
  48. mutex_.lock();
  49. pool_.push_back(std::unique_ptr<T>(t));
  50. mutex_.unlock();
  51. });
  52. pool_.pop_back();
  53. return std::move(ptr);
  54. }
  55. //TODO lock the date
  56. virtual std::shared_ptr<T> get_shared() {
  57. if (pool_.empty()) {
  58. throw std::logic_error("no more object");
  59. }
  60. auto pin = std::unique_ptr<T>(std::move(pool_.back()));
  61. pool_.pop_back();
  62. return std::shared_ptr<T>(pin.release(), [this](T* t) {
  63. pool_.push_back(std::unique_ptr<T>(t));
  64. });
  65. }
  66. virtual bool empty() const {
  67. return pool_.empty();
  68. }
  69. virtual size_t size() const {
  70. return pool_.size();
  71. }
  72. // lock
  73. virtual void inline lock() {
  74. mutex_.lock();
  75. }
  76. // unlock
  77. virtual void inline unlock() {
  78. mutex_.unlock();
  79. }
  80. // return mutex for lock section
  81. virtual boost::shared_mutex &mutex() {
  82. return mutex_;
  83. }
  84. protected:
  85. std::vector<std::unique_ptr<T>> pool_;
  86. // lock
  87. boost::shared_mutex mutex_;
  88. int total_ = 0;
  89. };
  90. } // namespace ia10k
  91. #endif // WISEOS_COMMON_OBJECTPOOL_H_

C++03

这里资源需要自己获取,用完还给对象池
ObjectPool.h

  1. #ifndef OBJECT_POOL_H_
  2. #define OBJECT_POOL_H_
  3. #include <queue>
  4. #include <boost/thread/locks.hpp>
  5. #include <boost/thread/shared_mutex.hpp>
  6. template <typename T>
  7. class ObjectPool
  8. {
  9. public:
  10. ObjectPool(int maxSize = 4)
  11. :maxSize_(maxSize),
  12. objSize_(0){
  13. }
  14. ~ObjectPool() {
  15. }
  16. static void array_delete_object(T* obj) {
  17. delete obj;
  18. }
  19. T& acquireObject(){
  20. if (all_objects_.empty()) {
  21. return NULL;
  22. }
  23. sharelock_.lock();
  24. if (all_objects_.empty()) {
  25. sharelock_.unlock();
  26. return NULL;
  27. }
  28. T *obj = all_objects_.front();
  29. all_objects_.pop();
  30. sharelock_.unlock();
  31. return (*obj);
  32. }
  33. void releaseObject(T& obj) {
  34. sharelock_.lock();
  35. all_objects_.push(&obj);
  36. sharelock_.unlock();
  37. }
  38. int addObj(T *obj) {
  39. sharelock_.lock();
  40. if (objSize_ >= maxSize_) {
  41. sharelock_.unlock();
  42. return -1;
  43. }
  44. all_objects_.push(obj);
  45. objSize_++;
  46. sharelock_.unlock();
  47. return 0;
  48. }
  49. T* subObj() {
  50. if (0 == objSize_) {
  51. return 0;
  52. }
  53. if (all_objects_.empty()) {
  54. return -1;
  55. }
  56. sharelock_.lock();
  57. if (0 == objSize_) {
  58. sharelock_.unlock();
  59. return 0;
  60. }
  61. if (all_objects_.empty()) {
  62. sharelock_.unlock();
  63. return -1;
  64. }
  65. T *obj = all_objects_.front();
  66. all_objects_.pop();
  67. objSize_--;
  68. sharelock_.unlock();
  69. return obj;
  70. }
  71. size_t totalSize() {
  72. return objSize_;
  73. }
  74. size_t queueSize() {
  75. return all_objects_.size();
  76. }
  77. private:
  78. std::queue<T*> all_objects_;
  79. int maxSize_;
  80. int objSize_;
  81. // lock
  82. boost::mutex sharelock_;
  83. };
  84. #endif //OBJECT_POOL_H_
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注