Boost logo

Boost Users :

From: Simon Pickles (sipickles_at_[hidden])
Date: 2008-07-30 03:44:00


Hi,

I am trying to implement a simple producer/consumer system with two or
more threads.

The main thread has a consumer class which creates producers. These
producers perform synchronous blocking operations then post their
outcome into a std::vector of results which was passed from the main
consumer.

class consumer
{
public:
    consumer()
    {
        m_results = boost::shared_ptr<std::vector<result> >( new
std::vector<result> );
        new producer( m_results, m_mutex ); // do a single task and put
result in m_results
    }

    void Process()
    {
        result r;
        {
            boost::mutex::scoped_lock lock(m_mutex);
            r = m_results.pop.front();
        }
        // Do stuff with r
    }

private:
    boost::mutex m_mutex;
    boost::shared_ptr<std::vector<result> > m_results;
};

class producer
{
    producer( boost::shared_ptr<std::vector<result> > results,
boost::mutex& mtx )
    {
        boost::thread( boost::bind( &DoInThread, this, results, mtx ) );
// actually uses a threadpool but not relevant here.
    }

    void DoInThread( boost::shared_ptr<std::vector<result> > results,
boost::mutex& mtx )
    {
        result r;
        // do long async op and store in r
        boost::mutex::scoped_lock lock(mtx);
        results->push_back(r);
    }
};

///////////////

I am trying to share a single mutex with both producer and consumer.
However I get a noncopyable error, even if I pass a reference.

Can anyone point out what the correct approach is?

Thanks

Simon


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net