我需要创建一个套接字连接池,它将被提供给多个工作线程。是否有一个线程安全的对象池实现,其功能类似于Apache Commons'GenericObjectPool
?
答案 0 :(得分:5)
我通常使用TBB来实现线程安全的可伸缩池。
template <typename T>
class object_pool
{
std::shared_ptr<tbb::concurrent_bounded_queue<std::shared_ptr<T>>> pool_;
public:
object_pool()
: pool_(new tbb::concurrent_bounded_queue<std::shared_ptr<T>>()){}
// Create overloads with different amount of templated parameters.
std::shared_ptr<T> create()
{
std::shared_ptr<T> obj;
if(!pool_->try_pop(obj))
obj = std::make_shared<T>();
// Automatically collects obj.
return std::shared_ptr<T>(obj.get(), [=](T*){pool_->push(obj);});
}
};
答案 1 :(得分:2)
答案 2 :(得分:1)
到目前为止,我发现的最好的即用型实现是Poco(可移植组件 - 整洁的C ++框架)中的一个。
有一个课程Poco::ObjectPool
- 请参阅文档here。您可以通过多种方式对其进行自定义,提供自己的工厂,用于创建,验证,停用和销毁对象。
同样奇怪的是,在撰写此答案时,他们的网站不包含最新生成的文档 - 我的最新Poco源代码有一个带有一些新功能的新版本,例如:现在borrowObject()
有一个超时参数对我来说很重要。