有条件的 std::future 和 std::async
Posted
技术标签:
【中文标题】有条件的 std::future 和 std::async【英文标题】:Conditional std::future and std::async 【发布时间】:2016-04-25 06:06:47 【问题描述】:我需要做有条件的行为。
std::future<int> f = pointer ? std::async(&Class::method, ptr) : 0;
// ... Some code
x = f.get();
因此,如果ptr
是nullptr
,我想将ptr->method()
调用的异步结果分配给x 结果或0。
上面的代码可以吗?我可以做这样的事情吗(将 'int' 分配给 'std::futture'?或者也许有更好的解决方案?
【问题讨论】:
【参考方案1】:std::future
没有转换 constructor 因此您的代码无效(如果您实际尝试编译代码,您会注意到)。
您可以做的是使用默认构造的未来,然后在使用未来之前检查它是否为valid。
【讨论】:
【参考方案2】:您可以在不使用这样的线程的情况下将值加载到未来:
std::future<int> f;
if ( pointer )
f = std::async(&Class::method, ptr);
else
std::promise<int> p;
p.set_value(0);
f = p.get_future();
// ... Some code
x = f.get();
但实现相同目标的更简单方法是:
std::future<int> f;
if ( pointer )
f = std::async(&Class::method, ptr);
// ... Some code
x = f.valid() ? f.get() : 0;
【讨论】:
【参考方案3】:您也可以为您的其他情况返回std::future
(使用不同的政策):
std::future<int> f = pointer
? std::async(&Class::method, ptr)
: std::async(std::launch::deferred, []() return 0;);
【讨论】:
以上是关于有条件的 std::future 和 std::async的主要内容,如果未能解决你的问题,请参考以下文章
使用 std::future 和 std::async 的依赖求解器
为啥 std::future 从 std::packaged_task 和 std::async 返回不同?
c++ 中的 std::promise 和 std::future