Boost logo

Boost Users :

Subject: [Boost-users] [Thread]: code snippet simulating future
From: Boost lzw (boostlzw_at_[hidden])
Date: 2010-03-30 09:03:47


Hi folks,

To better understand the "future" concept, I am looking at the following
code and have several questions:
(1) I got a compiling warning: 'this' : used in base member initializer
list. How can I get rid of it?
(2) how can I bind class's local data x_ into the new thread? I tried:
t_(boost::bind(&future<T>::run, this, x_) ), but it does not work.
(3) There seems a race condition in the overloaded function call
operator()(). What wrong did I do?

BTW: if the future is constructed as ctor using:
          future(boost::function<T ()> const& f);
the code snippet works with minor modification.

Thanks in advance,

Cheers,
Robert
====== code snippet =====
#include <boost/bind.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
#include <boost/function.hpp>

template<typename T>
class future : boost::noncopyable
{
public:
    future(boost::function<T (int)> const& f, int);
    T operator()();
private:
        int x_;
        bool joined_;
        T v_;
        boost::function<T (int)> const& f_;
        boost::mutex m_;
        void run();
        boost::thread t_;
};

template<typename T>
future<T>::future(boost::function<T (int)>const& f, int x) : x_(x),
joined_(false), v_(T()), f_(f), t_(boost::bind(&future<T>::run, this) ) { }

template<typename T>
T future<T>::operator()()
{
        mutex::scoped_lock lock(m_);
        if (!joined_) {
            t_.join();
            joined_ = true;
        }
        return v_;
}

template<typename T>
void future<T>::run()
{
    v_ = f_(x_);
}



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