Boost logo

Boost Users :

Subject: [Boost-users] future<>.then and promises
From: Tobias Furuholm (furuhlm_at_[hidden])
Date: 2013-06-27 08:26:47


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)

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);

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);

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);

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.

/Tobias



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