Boost logo

Boost :

Subject: [boost] [thread] Is there a non-blocking future-destructor?
From: Mikael Olenfalk (mikael.olenfalk_at_[hidden])
Date: 2015-10-11 14:43:03


I have stumbled on a minor inconvenience when it comes to using
boost::future. Below is a small example which first wraps an asio
io_service as an Executor (see even further below) and then uses
boost::async() to launch a simple task on the executor and tries to queue
up a continuation using future::then(Ex, F):

  1. the destructor of async_result does not block which is nice
  2. the destructor of continuation_result does block which is a bit of an
annoyance as this future I do not care about at all

Is there a way to make the destructor not block?


int main(int argc, char* argv[])
  boost::asio::io_service io_service;
  asio_executor executor{ io_service };

  auto async_result = boost::async(executor, []() { return 42; });
  // hangs:
  // async_result.then(executor, &g);

  // does not hang:
  auto continuation_result = async_result.then(executor,
[](boost::future<int> r) {
      cout << r.get() << endl;

  cout << "start io_service" << endl;;

  cout << "stop io_service" << endl;

  return 0;

class asio_executor : public boost::executors::executor
  asio_executor(boost::asio::io_service &ios)
    : _ios(ios)

  void close() override

  bool closed() override
    return _ios.stopped();

  void submit(work&& w) override
    // for some reason; causes endless
    // recursion and eventually a crash;

  bool try_executing_one() override
    return _ios.run_one() > 0;

  boost::asio::io_service &_ios;

Boost list run by bdawes at, gregod at, cpdaniel at, john at