我正在使用 astd::future<T>来存储可选异步操作的结果。根据函数的参数,操作可以是异步的,也可以是同步的。在同步情况下,我想将一个值存储在future. 我怎样才能最好地做到这一点?
https://en.cppreference.com/w/cpp/thread/future中给出的示例是:
future从一个packaged_taskfuture从一个async()future从一个promise但是没有 a make_future,构造函数也不允许从值future创建一个已完成的。 future因此,我创建了一个辅助函数来执行此操作,方法如下promise:
template <typename T>
std::future<T> make_future(T&& t)
{
std::promise<T> p;
p.set_value(std::forward<T>(t));
return p.get_future();
}
Run Code Online (Sandbox Code Playgroud)
std::future<T>这是从 a创建 a 的有效方法吗T?
std::future<T>有没有更好的方法从 a创建 a T?
编辑:示例,缓存:
Foo readAndCacheFoo(int id);
std::future<Foo> readFooAsync(int id)
{
{
const lock_guard lock{cacheMutex};
if (id == cachedId)
{
return make_future(cachedFoo);
}
}
return std::async(readAndCacheFoo, id);
}
Run Code Online (Sandbox Code Playgroud)
这可以很容易地完成,但有点复杂:
template <typename T>
std::future<T> make_future(T&& t)
{
auto fun = [val=std::forward<T>(t)]() { return val; };
std::packaged_task<T()> task(std::move(fun));
auto future = task.get_future();
task();
return future;
}
Run Code Online (Sandbox Code Playgroud)
请注意,std::future和packaged_task应该共享内部状态,因此这应该是安全的
编辑:实际上,您的代码似乎也是有效的,甚至更简单