Listing 2: Production::operator()().

template < typename _Tp,
  typename _ChannelTp = Channel<_Tp>, 
  typename _ProducerTp = Producer<_Tp, _ChannelTp>, 
  typename _ConsumerTp = Consumer<_Tp, _ChannelTp> >
class Production 
{
  ...
public:
  void operator()()
  {
    _ChannelTp chan(queueLen_);
    Latch theLatch, noLatch(true);
    _ProducerTp* producer = new _ProducerTp(chan, noLatch);
    _ConsumerTp* consumer = new _ConsumerTp(chan, syncStart_ ? 
                                                     theLatch : noLatch);
    std::auto_ptr<_ProducerTp> prodClean(producer);
    std::auto_ptr<_ConsumerTp> consClean(consumer);
    consumer->mayStop(false);
    // callback function for derived classes...
    pcModelCreated(*producer, *consumer);
    try {
      boost::thread_group pthreads, cthreads;
      int i;
      for (i = 0; i < nProducers_; ++i)
        pthreads.create_thread(*producer);
      for (i = 0; i < nConsumers_; ++i)
        cthreads.create_thread(*consumer);
      theLatch.release();
      beforeJoin();
      pthreads.join_all();
      while(chan.size() > 0) sleep(0, 10);
      // producers are done, consumers *may* stop...
      consumer->mayStop(true); 
      cthreads.join_all();
      afterJoin();
    } catch (boost::lock_error& err) {
      Logger::log(err.what());
    } catch (std::exception& err) { 
      Logger::log(err.what());
    } catch (...) {
      Logger::log("catched...");
    }
  }
  ...
};