2011-03-01 12 views

Respuesta

2

Echa un vistazo boost. flyweight.

+0

¿hay alguna discusión sobre los documentos de impulso en la seguridad de subprocesos de flyweight? – creatiwit

+0

@shrin: Si Flyweight es o no seguro para subprocesos depende de la [política de bloqueo] (http://www.boost.org/libs/flyweight/doc/reference/locking.html) que especifique. – ildjarn

4

Normalmente utilizo TBB para implementar pools escalables seguros.

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);}); 
     } 
    }; 
+0

+1 para TBB. ¡Quiéralo! –

1

La mejor implementación lista para usar que he encontrado hasta ahora es la de Poco (Portable Components - clean C++ framework).

Hay una clase Poco::ObjectPool - vea la documentación here. Puede personalizarlo de varias maneras, proporcionando su propia fábrica que crea, valida, desactiva y destruye objetos.

Además, extrañamente, al momento de escribir esta respuesta, su sitio no contiene el último documento generado; mi última fuente Poco tiene una versión más nueva con algunas funcionalidades nuevas, p. hay un parámetro de tiempo de espera para borrowObject() que fue crítico para mí.

Cuestiones relacionadas