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
被调用?如果是这样,我是否只是强迫它们顺序执行,因为它们的get
是按照accumulate
执行它们的顺序调用的?换句话说,我是否只是浪费时间设置这些未来,然后强制它们同步运行?
注意
函数Foo
只是一些例子,我使用的实际函数做更多的工作。
实际上,它们是在创建future
时启动的。它可能只被安排执行,或者可能在调用async
返回之前被启动。
可能会尝试使用线程池等来一次只保持一定数量的线程运行(至少在最初),但这是一个实现质量问题,并且在不增加干扰或要求更多调用函数的情况下正确实现这一点是困难的。
标准并没有强制要求任何接近这个级别的行为,但在实践中,异步异步实际上是异步的。
一旦调用std::async
,线程就会被启动。因此,您的线程将并发运行。
引用cpp-reference:
如果设置了异步标志(即策略&Std::launch::async != 0)然后async在一个新的执行线程上执行函数f初始化所有线程局部变量),就像由std::thread(f;Args…),除非函数f返回值或抛出异常时,它存储在共享状态中,可通过Std::future,异步返回给调用者。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 架构决策:返回std::future还是提供回调
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- C++17中的并行执行策略
- QML按钮点击功能执行顺序
- future::wait() 是否与 async() 执行线程的完成同步?
- 我可以在获取我的"std::future"时执行并等待它吗?
- 对std::future执行then会导致编译错误
- 在主线程中执行,boost::future::then
- std::future何时执行?
- 实现 future::then() 等效于 C++11 中的异步执行