返回异步结果 - 同步案例的高效处理

时间:2013-01-20 10:50:19

标签: c++ asynchronous c++11 future

您可以拥有像这样的异步API

std::future<int> GetAsync()

有些情况下,例如您已经缓存了结果,并希望返回使用结果初始化的未来。是否有一种方法可以使用当前标准(或提议)来实现这一目标,而无需重复创建额外的std :: promise或进行额外的异步(启动策略延迟)?

修改

还要考虑基于GetAsync()函数本地的某些状态计算结果的情况,以及如果选择在启动策略延迟时选择使用std :: async,则需要捕获可能的值

2 个答案:

答案 0 :(得分:10)

我显然误解了一些事情,为什么你不能这样做:

std::future<int> GetAsync()
{
  if (/*already got result*/)
  {
    std::promise<int> p;
    p.set_value(/*result*/);
    return p.get_future();
  }  
  return std::async(/*whatever is needed*/);
}

创建承诺有什么问题?如果你想从未来(异步返回对象)获得结果,你需要一个异步提供者,promise就是这样一种类型。

答案 1 :(得分:0)

有期货和承诺的东西是它们是为多线程使用而设计的。因此,如果您想要返回未来的对象,则需要通过std::async来电,std::packaged_task<>std::promise<>来创建。如果是这样的话,那么@ ronag的答案就会受到影响。

如果这不是一般情况,并且您只想将间接返回到您的值,则可以使用std::function进行直接计算,或围绕它caching mechanismExpected<T>处理错误的价值也像期货一样;所以你不会支付线程通信费用。