什么时候std :: future被执行了?

时间:2015-07-06 20:13:50

标签: c++ multithreading c++11 future

创建线程并将启动策略设置为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被调用?如果是这样,我是否只是强制它们按顺序执行,因为get是按accumulate执行它们的顺序调用的?换句话说,我是否只是浪费时间设置这些期货,然后强迫它们同步运行?

注意
函数Foo只是一些例子,我使用的实际函数做了更多的工作。

2 个答案:

答案 0 :(得分:4)

实际上,它们是在您创建future时启动的。它可能只被安排执行,或者可能在调用async之前实际启动。

可能有一些尝试只保留一定数量的线程(至少在最初阶段)运行线程池等,但这是一个实施问题的质量,并且在没有更多干扰或需要更多的情况下正确实现来自被调用的函数很难。

该标准并未规定任何接近该行为级别的内容,但在实践中,异步异步实际上是异步的。

答案 1 :(得分:1)

一旦拨打std::async,线程就会启动。因此,您的线程将同时运行。

引用cpp-reference

  

如果设置了异步标志(即policy&amp; std :: launch :: async!= 0),   然后异步在新的执行线程上执行函数f(使用   所有线程局部化初始化)好像由std :: thread(f,   args ...),除非函数f返回一个值或抛出一个   异常,它存储在可通过的可访问的共享状态中   std :: future异步返回给调用者。