c++ - std::future 什么时候执行?

标签 c++ multithreading c++11 future

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

a new thread is launched to execute the task asynchronously

如果我有一些任意函数

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

然后我像这样设置了一个异步调用

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 执行它们的顺序调用的?换句话说,我只是在浪费时间设置这些 future ,然后强制它们同步运行吗?

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

最佳答案

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

可能有一些尝试通过线程池等方式(至少在最初)一次只保持一定数量的线程运行,但这是实现质量问题,并且在不更具侵入性或要求更多的情况下获得正确的结果从被调用函数很难。

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

关于c++ - std::future 什么时候执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31254783/

相关文章:

java - 在不检查异常的情况下查找我们是否在线程绑定(bind)请求中的安全方法

c++ - 安全的、密码特定的 std::string 在解除分配时将自身归零

c++ - 如何使用#pragma message() 使消息指向文件(lineno)?

c++ - 可以使用模板在 C++ 中按名称访问位字段成员吗?

java - 情境使用 : Run tasks in ForkJoinPool vs. new Thread

c++ - 创建线程的简单错误

c++ - 在可变参数模板的参数中解构 POD 结构

C++ 构造函数问题

c++ - 如何找出某个标准C++函数的实现细节?

multithreading - go 语言 web 框架设计线程明智