你可以有一个像这样的异步 API
std::future<int> GetAsync()
在某些情况下,例如您已经缓存了结果并希望返回使用结果初始化的未来。当前标准(或提案)是否有办法实现这一目标,而无需重复创建额外的 std::promise 或进行额外的异步(延迟启动策略)?
编辑
还要考虑基于 GetAsync() 函数的某些本地状态计算结果的情况,并且如果选择使用 std::async 并延迟启动策略,则可能需要按值捕获该结果
你可以有一个像这样的异步 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*/);
}
创建承诺有什么问题?如果您想从未来(异步返回对象)中获取结果,则需要异步提供者,apromise
就是这样一种类型。
futures 和 promises 的特点是它们是为多线程使用而设计的。因此,如果您想返回一个未来对象,您需要通过std::async
调用 astd::packaged_task<>
或 a来创建它std::promise<>
。如果是这样的话,@ronag 的回答很成功。
如果这不是一般情况,并且您只想将间接返回到您的值,则可以使用 astd::function
进行直接计算,或围绕它的缓存机制Expected<T>
,或者像期货一样处理错误的值;所以你不会支付线程通信费用。