
Simon Pickles wrote:
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 mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
Okay, I think my problem is that I cannot pass the mutex reference as an argument in boost::bind. Is there a workaround? Si