cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
object_pool.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <functional>
4#include <memory>
5#include <mutex>
6#include <queue>
7#include <stdexcept> // For potential exceptions if needed
8#include <vector> // Alternative storage
9
10namespace toolbox::base
11{
12
13template<typename T>
14class object_pool_t; // Forward declaration
15
30template<typename T>
32{
33 object_pool_t<T>* pool_ =
34 nullptr; // 指向对象池的非拥有指针/Non-owning pointer to the pool
35
36public:
42 explicit PoolDeleter(object_pool_t<T>* pool = nullptr)
43 : pool_(pool)
44 {
45 }
46
52 void operator()(T* ptr) const
53 {
54 if (pool_ && ptr) {
55 pool_->release(ptr); // 告诉池回收对象/Tell the pool to take it back
56 } else {
57 // 如果没有关联的池,执行默认删除/If no pool is associated, perform default
58 // delete 处理在池外创建新对象或池过早销毁的情况/This handles cases where
59 // acquire might create a new object outside the pool's direct management
60 // or if the pool is destroyed early
61 delete ptr;
62 }
63 }
64};
65
98template<typename T>
100{
101public:
107 using PooledObjectPtr = std::unique_ptr<T, PoolDeleter<T>>;
108
117 explicit object_pool_t(size_t initial_size = 0,
118 std::function<void(T&)> resetter = nullptr)
119 : reset_func_(std::move(resetter))
120 {
121 for (size_t i = 0; i < initial_size; ++i) {
122 pool_.push(std::make_unique<T>());
123 }
124 }
125
126 // 为简单起见删除复制/移动操作/Deleted copy/move operations for simplicity
127 object_pool_t(const object_pool_t&) = delete;
131
143 {
144 std::unique_ptr<T> obj_ptr = nullptr; // 用于临时所有权的 unique_ptr/Use
145 // unique_ptr for temporary ownership
146
147 { // 锁作用域/Lock scope
148 std::lock_guard<std::mutex> lock(mutex_);
149 if (!pool_.empty()) {
150 obj_ptr = std::move(pool_.front()); // 从池中取出/Take from pool
151 pool_.pop();
152 }
153 } // 在可能创建新对象前解锁互斥量/Unlock mutex before potentially creating
154 // a new object
155
156 if (!obj_ptr) { // 如果池为空/If pool was empty
157 obj_ptr = std::make_unique<T>(); // 创建新对象/Create a new one
158 }
159
160 // 将对象包装在带自定义删除器的 unique_ptr 中返回/Return the object wrapped
161 // in a unique_ptr with our custom deleter
163 }
164
176 void release(T* ptr)
177 {
178 if (!ptr)
179 return;
180
181 // 如果有重置函数则重置对象状态/Reset object state if a reset function is
182 // available
183 if (reset_func_) {
184 try {
185 reset_func_(*ptr);
186 } catch (const std::exception& e) {
187 // 记录错误?不要让重置器的异常破坏池/Log error? Don't let exceptions
188 // from resetter break the pool
189 // 考虑使用不使用此池的机制进行日志记录/Consider logging using a
190 // mechanism that doesn't use this pool
191 fprintf(stderr, "[ObjectPool] Exception during reset: %s\n", e.what());
192 // 决定是继续池化对象还是删除它/Decide whether to still pool the object
193 // or delete it 如果重置严重失败,删除可能更安全/Deleting might be safer
194 // if reset failed critically
195 delete ptr;
196 return;
197 } catch (...) {
198 fprintf(stderr, "[ObjectPool] Unknown exception during reset.\n");
199 delete ptr;
200 return;
201 }
202 }
203
204 std::unique_ptr<T> obj_ptr(ptr); // 重新包装原始指针以管理所有权/Re-wrap
205 // raw pointer to manage ownership
206 { // 锁作用域/Lock scope
207 std::lock_guard<std::mutex> lock(mutex_);
208 pool_.push(std::move(obj_ptr)); // 将 unique_ptr 添加回池中/Add
209 // unique_ptr back to the pool
210 }
211 }
212
213private:
214 friend class PoolDeleter<T>; // 允许删除器调用 release/Allow deleter to call
215 // release
216
217 std::queue<std::unique_ptr<T>> pool_; // 对象池队列/Object pool queue
218 mutable std::mutex mutex_; // 用于线程安全的互斥量/Mutex for thread safety
219 std::function<void(T&)> reset_func_; // 对象重置函数/Object reset function
220};
221
222} // namespace toolbox::base
Definition object_pool.hpp:32
PoolDeleter(object_pool_t< T > *pool=nullptr)
构造 PoolDeleter/Construct a PoolDeleter
Definition object_pool.hpp:42
void operator()(T *ptr) const
std::unique_ptr 调用此函数代替 delete/The function called by std::unique_ptr instead of delete
Definition object_pool.hpp:52
Definition object_pool.hpp:100
object_pool_t(size_t initial_size=0, std::function< void(T &)> resetter=nullptr)
构造对象池/Construct an object pool
Definition object_pool.hpp:117
object_pool_t & operator=(const object_pool_t &)=delete
void release(T *ptr)
将对象释放回池中/Release an object back to the pool
Definition object_pool.hpp:176
object_pool_t(object_pool_t &&)=delete
object_pool_t(const object_pool_t &)=delete
std::unique_ptr< T, PoolDeleter< T > > PooledObjectPtr
管理池化对象的 unique_ptr 的别名。当超出作用域时自动将对象返回池中/ Alias for a unique_ptr managing a pooled object....
Definition object_pool.hpp:107
PooledObjectPtr acquire()
从池中获取一个对象/Acquire an object from the pool
Definition object_pool.hpp:142
object_pool_t & operator=(object_pool_t &&)=delete
提供基础 C++ 工具和组件。 Provides fundamental C++ utilities and components.