Boost logo

Boost Users :

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


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_at_[hidden]
> 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


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