boost :: future和continuations - 值集,但未来仍然阻止

时间:2014-03-24 18:15:11

标签: c++ boost future continuations

我正在努力使以下继续工作 - 但f.get()阻止。怎么了?

#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();
}

它会打印"done:",所以未来会发生火灾,但它会立即打开&#34;挂起&#34;在f.get() ..我迷路了。

构建:

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

更新:以下代码更改将使示例正常工作 - 但为什么?因为f2无论如何都没有使用过。再次困惑。

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

更新2 :以下内容,添加启动政策launch::deferred也将有效:

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

这也是:

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

1 个答案:

答案 0 :(得分:3)

问题是,你的未来不会被保留。实际上,它是一个临时的,一旦语句(.then())结束就会被破坏。

修复它:

int main () {
    Foo foo;

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

    foo.finish();
    f2.get();
}

现在打印

done:
23

查看 Live On Coliru

如果您在f2.get()之前移动foo.finish(),它将再次死锁。