为什么HPX要求Future的“ then”成为DAG(有向无环图)的一部分?

时间:2019-05-03 15:56:33

标签: hpx

在HPX入门教程中,您了解到可以利用Future的then()方法,该方法使您可以在将来准备好时将要计算的某些操作加入队列。

在本手册中,当解释如何使用thens时有一句话说"Used to build up dataflow DAGs (directed acyclic graphs)"

我的问题是,这个队列必须是非循环的,这意味着什么?我可以创建一个函数来重新计算then中的未来吗?看起来像myfuture.then( recompute myfuture ; myfuture.then() )吗?

1 个答案:

答案 0 :(得分:0)

您可以想到hpx::future(非常相似,如果与std::experimental::future不同,请参阅https://en.cppreference.com/w/cpp/experimental/future)是匿名生产者和使用者之间的一次性管道。它不代表任务本身,而仅代表产生的结果(可能尚未计算出)。

因此,“重新计算”未来(如您所说)只能意味着从异步提供程序(hpx::asyncfuture<>::then等)中重新初始化未来。

hpx::future<int> f = hpx::async([]{ return 42; });

hpx::future<int> f2 = f.then(
    [](hpx::future<int> r) 
    {
        // this is guaranteed not to block as the continuation 
        // will be called only after `f` has become ready (note:
        // `f` has been moved-to `r`)
        int result = r.get();

        // 'reinitialize' the future
        r = hpx::async([]{ return 21; });

        // ...do things with 'r'

        return result;
    });

// f2 now represents the result of executing the chain of the two lambdas
std::cout << f2.get() << '\n';        // prints '42'

我不确定这是否能回答您的问题以及您为什么要这样做,但是您来了。