Boost logo

Boost :

Subject: [boost] [threadpool]thread management strategies
From: vicente.botet (vicente.botet_at_[hidden])
Date: 2008-09-16 01:37:47


Hi,

I have do a comparaison of the three thread management strategies fixed,
lazy and adaptive header files and I found some incoherences that are
possible bugs.

* In fixed.hpp and lazy.hpp the size_ function should be const

  std::size_t size_()
  { return worker_.size(); }

* In lazy.hpp submit_ is not used
  channel_iterator submit_( channel_item const& itm)
  { return channel_.put( itm); }

* In adaptive and lazy add the assertion on constructor
BOOST_ASSERT( lwm <= hwm);

* In adaptive
  void core_size( std::size_t size)
  {
   shared_lock< shared_mutex > lk( mtx_worker_);
   core_size_ = size;
  }

must use a unique_lock instead of a shared_lock

* In lazy
  std::size_t max_size()
  {
            return max_size_;
  }

should't have a shared_lock guard.

The three files have more in common than differences.

Doesn't the following pools behaves identically

boost::tp::pool<
  boost::tp::fixed,
  boost::tp::unbounded_channel< boost::tp::fifo >
> pool( boost::tp::max_poolsize( 10) );

boost::tp::pool<
  boost::tp::lazy< depend_on_core >,
  boost::tp::unbounded_channel< boost::tp::fifo >
> pool( boost::tp::preallocate( 10),
  boost::tp::core_poolsize( 10),
  boost::tp::max_poolsize( 10) );

boost::tp::pool<
  boost::tp::adaptive<
    depend_on_core,
    keep_core_size
>,
  boost::tp::unbounded_channel< boost::tp::fifo >
> pool(
  boost::tp::preallocate( 10),
  boost::tp::core_poolsize( 10),
  boost::tp::max_poolsize( 10),
  boost::posix_time::very_high
);

Looking at the differences we have the following feature model

PoolSize: fixed|variable[AdjustmentPolicy, ShrinkPolicy]
ShrinkPolicy: no_shrink | shrink [RecreatePolicy]

I was wondering if we can define a class thread_management taking a feature
expression and use it as follows

thread_management<fixed> to mean the current fixed
thread_management<variable<AdjustmentPolicy> > to mean the current
lazy<AdjustmentPolicy>
thread_management<variable<AdjustmentPolicy, shrink<RecreatePolicy> > >

The advantage of this approach is that we avoid the incoherences.
The liability is that this class must use metaprogramming in its
implementation to preserv the efficiency.

What do you think?

Vicente


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk