有条件的 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();

因此,如果ptrnullptr,我想将ptr-&gt;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 返回不同?

异常传播和 std::future

c++ 中的 std::promise 和 std::future

记录一个std::future和std::async的demo

如何将 std::future<T> 转换为 std::future<void>?