从 T 创建 std::future 的最佳方式<T>
Best way to create a std::future<T> from a T
我正在使用std::future<T>
来存储可选异步操作的结果。根据函数的参数,操作可以是异步的,也可以是同步的。在同步情况下,我有一个值,我想将其存储在future
中。我该如何最好地做到这一点?
https://en.cppreference.com/w/cpp/thread/future 中给出的例子是:
packaged_task
future
async()
future
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();
}
这是从T
创建std::future<T>
的有效方法吗?
有没有更好的方法从T
创建std::future<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);
}
这很容易完成,但有点复杂:
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;
}
请注意,std::future
和packaged_task
应该共享内部状态,因此这应该是安全的
编辑: 实际上,您的代码似乎也是有效的,甚至更简单
这是从 T 创建 std::future 的有效方法吗?
是的,它是。
但是,我想说"make_future"可能不是最合适的名称。"future"类的整个想法是,它的值可能在未来准备就绪,而你的函数总是返回一个已经实现的未来。
嗯,这只是一个名字...阿法克,你的逻辑很好。
编辑: 关于make_ready_future
和make_exceptional_future
职能,有一个C++建议。 P0159R0
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中