繁体   English   中英

std :: future什么时候执行?

[英]When does std::future get executed?

创建启动策略设置为std::launch::async的线程时,在cppreference上给出的描述为

启动新线程以异步执行任务

如果我有一些任意功能

double Foo(double i)
{
    return i * 5.0;
}

我像这样设置了一个async调用

std::vector<double> values{5.0, 2.3, 7.1, 4.8, 1.5};
std::vector<std::future<double>> answers;
for (double value : values)
{
    answers.push_back(std::async(std::launch::async,
                                 Foo,
                                 value));
}

当我调用std::accumulate像这样:

double total = std::accumulate(begin(answers),
                               end(answers),
                               0.0,
                               [](double x, std::future<double>& t){return x + t.get();});

每个线程何时开始执行? 他们一被添加到answers就开始吗? 还是他们等到调用get之前? 如果是这样,我是否只是因为它们的getaccumulate执行它们的顺序被调用而强迫它们按顺序执行? 换句话说,我是否只是在浪费时间建立这些期货,然后强迫它们同步运行?

注意
函数Foo只是一些示例,我正在使用的实际函数可以完成更多工作。

实际上,它们是在您创造future时开始的。 它可能仅计划执行,或者实际上可能在async调用返回之前启动。

可能会尝试通过线程池等保持每次运行一定数量的线程(至少在最初阶段),至少这是一次尝试,但这是实现质量的问题,并且在不造成干扰或不要求被调用者更多的情况下实现正确功能很难。

该标准并未强制要求任何接近该行为级别的行为,但实际上,异步异步实际上是异步的。

一旦调用std::async ,线程将开始启动。 这样,您的线程将同时运行。

引用cpp-reference

如果设置了异步标志(即policy&std :: launch :: async!= 0),则异步将在新的执行线程(已初始化所有线程本地变量)上执行函数f,就像由std :: thread产生(f,args ...),不同之处在于,如果函数f返回值或引发异常,则它将存储在可通过std :: future访问的共享状态中,异步返回给调用者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM