boost :: future and continuations - Wert gesetzt, Zukunft aber weiterhin blockiert

Ich versuche folgende Fortsetzung zum Laufen zu bringen - aberf.get() Blöcke. Was ist los mit dir?

#include <iostream>

#define BOOST_THREAD_PROVIDES_FUTURE
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
#include <boost/thread/future.hpp>

struct Foo {

   boost::future<int> start() {
      return p.get_future();
   }

   void finish() {
      p.set_value(23);
   }

   boost::promise<int> p;
};

int main () {

   Foo foo;

   foo.start().then([](boost::future<int> f) {
      std::cout << "done:" << std::endl;
      std::cout << f.get() << std::endl;
   });

   foo.finish();
}

Es wird das drucken"done:", also die Zukunft brennt, aber es wird dann einfach "hängen bleiben"f.get() .. Ich bin verloren.

Bauen:

clang++ -o test8 -std=c++11 -stdlib=libc++ -lboost_thread -lboost_system \
  -I/home/oberstet/boost_1_55_0 -L/home/oberstet/boost_1_55_0/stage/lib \
  test8.cpp

AKTUALISIEREN: Die folgende Codeänderung bewirkt, dass das Beispiel funktioniert - aber warum? Schon seitf2 wird sowieso nicht verwendet. Wieder verwirrt.

   boost::future<void> f2 = foo.start().then([](boost::future<int> f) {
      std::cout << "done:" << std::endl;
      std::cout << f.get() << std::endl;
   });

UPDATE 2: Folgendes, Hinzufügen einer Startrichtlinielaunch::deferredwird auch funktionieren:

   foo.start().then(boost::launch::deferred, [](boost::future<int> f) {
      std::cout << "done:" << std::endl;
      std::cout << f.get() << std::endl;
   });

und das auch:

   boost::future<int> start() {
      boost::future<int> f = p.get_future();
      f.set_deferred();
      return f;
   }

Antworten auf die Frage(1)

Ihre Antwort auf die Frage