【问题标题】:Is there an open source thread safe C++ object pool implementation? [closed]是否有开源线程安全的 C++ 对象池实现? [关闭]
【发布时间】:2011-07-06 21:43:59
【问题描述】:

我需要创建一个套接字连接池,它将提供给多个工作线程。是否有功能类似于 Apache Commons 的GenericObjectPool 的线程安全对象池实现?

【问题讨论】:

    标签: c++ thread-safety object-pooling


    【解决方案1】:

    我通常使用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);}); 
            }
        };
    

    【讨论】:

      【解决方案2】:

      查看boost.flyweight

      【讨论】:

      • 是否有关于flyweight线程安全的boost文档的讨论?
      • @shrin : Flyweight 是否是线程安全的取决于你指定的locking policy
      【解决方案3】:

      目前我发现的最好的即用型实现是 Poco(便携式组件 - 简洁的 C++ 框架)中的实现。

      有一个类Poco::ObjectPool - 请参阅文档here。您可以通过多种方式自定义它,提供您自己的创建、验证、停用和销毁对象的工厂。

      在撰写此答案时也很奇怪,他们的网站不包含最新生成的文档-我最新的 Poco 源具有具有一些新功能的较新版本,例如borrowObject() 现在有一个超时参数,这对我来说很重要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-17
        • 1970-01-01
        • 2019-12-04
        • 2011-09-11
        • 2014-04-27
        • 2011-05-17
        相关资源
        最近更新 更多