【问题标题】:Is .thenValue() blocking?.thenValue() 是否阻塞?
【发布时间】:2020-09-16 10:57:14
【问题描述】:

在很多地方我都能找到类似的东西:

std::move(A).thenValue(B)

thenValue() 是否阻塞了未来的“A”。我通读了 Folly 文档,但无法理解。 https://github.com/facebook/folly/blob/master/folly/docs/Futures.md

【问题讨论】:

  • 我不熟悉Folly,但是,它怎么可能不阻塞?如果它不阻塞你会得到什么?
  • 开头的段落说它附加了一个回调。我不明白为什么会阻塞,特别是因为代码 sn-p 似乎表明它返回第二个Future

标签: c++ future folly


【解决方案1】:

不,它没有阻塞。从概念上讲,您可以将签名想象成这样(尽管这不是实际的签名):

template <typename T>
template <typename TResult>
Future<TResult> Future<T>::thenValue(std::function<TResult(T&&)> callback) { ... }

基本思想是,如果std::move(A)代表的future成功,则执行传递的回调(B),传入Afuture产生的值。回调的返回值成为thenValue()返回的future的结果。

如果你是一个视觉型的人(比如我),那么标记部分签名可能会有所帮助:

template <typename T>
template <typename TResult>
Future<TResult> Future<T>::thenValue(std::function<TResult(T&&)> callback) { ... }
^^^^^^^^^^^^^^^ ^^^^^^^^^                                        ^^^^^^^^
       3            1                                                2
  1. 您正在调用thenValue 的未来。
  2. 你传递给thenValue的回调函数。
  3. thenValue 返回的未来。

当 (1) 有一个成功的结果时, (2) 会使用该结果调用。当(2)返回时,(3)产生(2)的返回值。

future(3)是同步构造的,但是callback(2)是异步调用的。

【讨论】:

    猜你喜欢
    • 2011-04-09
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多