|
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