Есть ли потокобезопасная реализация пула объектов C ++ с открытым исходным кодом? - PullRequest
5 голосов
/ 02 марта 2011

Мне нужно создать пул соединений сокетов, который будет обслуживаться несколькими рабочими потоками. Существует ли потокобезопасная реализация пула объектов с функциональностью, аналогичной Apache Commons 'GenericObjectPool?

Ответы [ 3 ]

5 голосов
/ 02 марта 2011

Я обычно использую 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 голосов
/ 02 марта 2011
1 голос
/ 23 ноября 2016

Лучшая готовая к использованию реализация, которую я нашел на данный момент, - это Poco (Portable Components - аккуратная среда C ++).

Существует класс Poco::ObjectPool - см. Документацию здесь . Вы можете настроить его несколькими способами, предоставив собственную фабрику, которая создает, проверяет, деактивирует и уничтожает объекты.

Также странно, что на момент написания этого ответа на их сайте не было последнего сгенерированного документа - мой последний исходный код Poco имеет более новую версию с некоторыми новыми функциями, например, есть параметр тайм-аута для borrowObject(), который был для меня критически важным.

...