高效处理同步案例
你可以有一个像这样的异步API
std::future<int> GetAsync()
有些情况下,例如,您已经将结果缓存起来,并希望返回使用结果初始化的将来。 有没有现行的标准(或提案)的方式来实现这一点,而无需重复创建额外的std :: promise或进行额外的异步(使用推迟策略)?
编辑
考虑结果是基于GetAsync()函数的本地状态计算的结果,以及在某些情况下,如果选择使用std :: async并且启动策略被推迟
我显然误解了一些事情,为什么你不能这样做:
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
就是这样一种类型。
有期货和承诺的是他们是为多线程使用而设计的。 所以如果你想返回一个未来的对象,你需要通过std::async
调用, std::packaged_task<>
或者std::promise<>
来创建它。 如果是这种情况@ ronag的答案是一个打击。
如果这不是一般情况,并且你只想返回一个间接值到你的值,你可以使用一个std::function
来进行直接计算,或者一个缓存机制,或者一个Expected<T>
值来处理错误,比如期货确实; 所以你不会支付线程通信费用。