Boost logo

Boost Users :

Subject: Re: [Boost-users] future<>.then and promises
From: Vicente J. Botet Escriba (vicente.botet_at_[hidden])
Date: 2013-06-27 15:01:09


Le 27/06/13 14:26, Tobias Furuholm a écrit :
> I am trying out future<>.then and I am seeing some results that
> confuses me. I have tried to illustrate this with a few examples. The
> first example is using a promise together with future<>.then. It
> generates no output:
>
> boost::promise<int> promise;
> boost::future<int> fut = promise.get_future();
> promise.set_value(123);
>
> fut.then([](boost::future<int>& f) {
> std::cout << "The value is: " << f.get() << std::endl;
> return f.get();
> });
>
> boost::chrono::milliseconds duration(1000);
> boost::this_thread::sleep_for(duration);
>
> Why is fut.then not triggered? (assigning fut.then to another future
> makes no difference)
I guess you need to call fut.then() before the value is set. I will need
to check if this works when the future is not created with async().
>
> By adding a launch policy I get the output "The value is: 123" which
> is the output I would expect from all my examples:
>
> boost::promise<int> promise;
> boost::future<int> fut = promise.get_future();
>
> promise.set_value(123);
>
> fut.then(boost::launch::async, [](boost::future<int>& f) {
> std::cout << "The value is: " << f.get() << std::endl;
> return f.get();
> });
>
> boost::chrono::milliseconds duration(1000);
> boost::this_thread::sleep_for(duration);
>
Could you tell me the version of BOOST_THREAD_VERSION are you using?

> To make this more real, let's move promise.set_value to after .then
>
> boost::promise<int> promise;
> boost::future<int> fut = promise.get_future();
>
> fut.then(boost::launch::async, [](boost::future<int>& f) {
> std::cout << "The value is: " << f.get() << std::endl;
> return f.get();
> });
>
> promise.set_value(123);
>
> boost::chrono::milliseconds duration(1000);
> boost::this_thread::sleep_for(duration);
>
> This program outputs nothing and never terminates. But when I assign
> the result of fut.then to another future I get the expected output
> once again:
>
> boost::promise<int> promise;
> boost::future<int> fut = promise.get_future();
>
> boost::future<int> fut2 = fut.then(boost::launch::async,
> [](boost::future<int>& f) {
> std::cout << "The value is: " << f.get() << std::endl;
> return f.get();
> });
>
> promise.set_value(123);
>
> boost::chrono::milliseconds duration(1000);
> boost::this_thread::sleep_for(duration);
>
Where is the assignment?
Again I will need to check this.
> Finally, as I bonus I add an example where I use async to generate a
> future instead.
>
> boost::future<int> fut = boost::async([]() { return 123; });
>
> fut.then([](boost::future<int>& f) {
> std::cout << "The value is: " << f.get() << std::endl;
> return f.get();
> });
>
> boost::chrono::milliseconds duration(1000);
> boost::this_thread::sleep_for(duration);
>
future::get() can be called only once depending on the value of
BOOST_THREAD_VERSION
> This generates the output "The value is: " (without 123). Once again,
> by assigning the result of fut.then to another future I get the
> expected output.
>
> I use boost 1.54 beta 1 with clang 3.2 on Linux and.
>
Please, could you provide complete examples, and the command line?

Best,
Vicente


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