为什么boost :: future continuation(.then())按照我不期望的方式工作?

时间:2015-11-20 11:34:17

标签: c++ boost future

#include <iostream>
#include <string>
#include "unistd.h"
#define BOOST_THREAD_VERSION 3
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
#include "boost/thread/future.hpp"

int main(int argc, char** argv) 
{
    using boost::future;

    boost::make_ready_future(3)
    .then([](future<int> a){return std::string("mu");})
    .then([](future<std::string> hi){
        std::cout << "mu1\n";
        auto ret =  (int)(5 + hi.get().size());
        std::cout << "mu2\n";
        return ret;
    })
    .then([](future<int> val){ std::cout << "khm: \n" << val.get() << " viii\n" << std::endl;})
    //.get()
    ;
    sleep(10);
    return 0;
}

上面的代码会发出以下内容:

mu1
mu2
khm:

如果我取消注释链末尾的.get(),我会得到:

mu1
mu2
khm:
7 viii

正如我原先预料的那样。

但为什么呢? 我希望将then()作为参数传递的lambdas在我得到前一个结果后立即执行。所以它应该没有最后get()。 另一方面,如果需要最终get()来启动执行链,为什么mu1 / mu2 / khm会在没有它的情况下打印出来?

感谢您提供的任何见解!

0 个答案:

没有答案