典型的对象池实现,一般用于支持这样的应用场景
典型如通信用的socket,用于模型推理的存储结构等
底层实现基于bounded_queue来提供wait-free的资源申请和归还,根据典型场景包装形成两种模式
#include "babylon/concurrent/object_pool.h"
// 默认构造的对象池容量为0,需要经过设置后才可使用
::babylon::ObjectPool<R> pool;
// 设置最大容量
pool.reserve_and_clear(N);
// 设置自动清理函数,设置后对于进入对象池的实例,会自动调用清理函数
// 注意:对自动创建模式,溢出后直接销毁的实例也会在销毁前先进行清理
pool.set_recycler([] (R& resource) {
// 清理资源实例
});
/////////////////
// 严格有限模式
for (...) {
// 预先注入定量的实例
pool.push(std::make_unique<R>(...));
}
parallel loop:
// 通过pop获取实例,如果对象池为空,会阻塞等待直到有实例被归还
auto ptr = pool.pop();
ptr->...; // 返回值为定制Deleter的智能指针
// 析构时实例自动归还
/////////////////
/////////////////
// 自动创建模式
// 通过设置构造回调来启用自动创建模式
pool.set_creator([] {
return new R(...);
});
parallel loop:
// 通过pop获取实例,如果对象池为空,会自动调用构造回调
auto ptr = pool.pop();
ptr->...; // 返回值为定制Deleter的智能指针
// 析构时实例自动归还,池内实例超出容量N后,超出部分会直接销毁
/////////////////