我正在使用std::future<T>
来存储可选的异步操作的结果。根据函数的参数,操作可以是异步的也可以是同步的。在同步情况下,我有一个要存储在future
中的值。我如何最好地做到这一点?
https://en.cppreference.com/w/cpp/thread/future中给出的示例是:future
中的
packaged_task
future
中的async()
future
中的promise
但是,没有
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();
}
这是从
std::future<T>
创建T
的有效方法吗?有更好的方法从
std::future<T>
创建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);
}
最佳答案
Is this a valid way to create a std::future from a T?
是的。
但是,我想说“make_future”可能不是最合适的名称。 “ future ”类的整个想法是,它的值(value)可能在将来准备好,而您的函数总是返回已经实现的 future 。
好吧,这只是个名字... Afaik,您的逻辑很好。
关于c++ - 从T创建std::future <T>的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59712523/