2

你可以有一个像这样的异步 API

std::future<int> GetAsync()

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

编辑

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

4

2 回答 2

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*/);
}

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

于 2013-01-20T11:49:34.113 回答
0

futures 和 promises 的特点是它们是为多线程使用而设计的。因此,如果您想返回一个未来对象,您需要通过std::async调用 astd::packaged_task<>或 a来创建它std::promise<>。如果是这样的话,@ronag 的回答很成功。

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

于 2013-01-20T11:55:21.153 回答