【发布时间】:2011-07-06 21:43:59
【问题描述】:
我需要创建一个套接字连接池,它将提供给多个工作线程。是否有功能类似于 Apache Commons 的GenericObjectPool 的线程安全对象池实现?
【问题讨论】:
标签: c++ thread-safety object-pooling
我需要创建一个套接字连接池,它将提供给多个工作线程。是否有功能类似于 Apache Commons 的GenericObjectPool 的线程安全对象池实现?
【问题讨论】:
标签: c++ thread-safety object-pooling
我通常使用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);});
}
};
【讨论】:
【讨论】:
目前我发现的最好的即用型实现是 Poco(便携式组件 - 简洁的 C++ 框架)中的实现。
有一个类Poco::ObjectPool - 请参阅文档here。您可以通过多种方式自定义它,提供您自己的创建、验证、停用和销毁对象的工厂。
在撰写此答案时也很奇怪,他们的网站不包含最新生成的文档-我最新的 Poco 源具有具有一些新功能的较新版本,例如borrowObject() 现在有一个超时参数,这对我来说很重要。
【讨论】: