我写了一些代码来诊断默认启动策略和std :: launch :: deferred之间的区别。
#include <chrono>
#include <vector>
#include <future>
#include <thread>
#include <iostream>
int main() {
auto func = [] {
std::cout << std::this_thread::get_id() << "," << std::flush;
int i=std::numeric_limits<int>::max();
while(i--);
std::cout << "b" << std::flush;
};
std::vector<std::future<void> > vec;
for (int i = 0; i < 10; ++i) {
vec.push_back(std::async( std::launch::deferred, func ));
}
for (auto &t : vec) {
t.get();
}
}
上述代码的输出是:
140257438672704,b140257438672704,b140257438672704,b140257438672704,b140257438672704,b140257438672704,b140257438672704,b140257438672704,b140257438672704,b140257438672704,B
#include <chrono>
#include <vector>
#include <future>
#include <thread>
#include <iostream>
int main() {
auto func = [] {
std::cout << std::this_thread::get_id() << "," << std::flush;
int i=std::numeric_limits<int>::max();
while(i--);
std::cout << "b" << std::flush;
};
std::vector<std::future<void> > vec;
for (int i = 0; i < 10; ++i) {
vec.push_back(std::async( func ));
}
for (auto &t : vec) {
t.get();
}
}
上述代码的输出是:
140200948524864,b140200948524864,b140200948524864,b140200948524864,b140200948524864,b140200948524864,b140200948524864,b140200948524864,b140200948524864,b140200948524864,B
它仍在主线程上运行任务。 我的问题是为什么在使用默认启动策略(我的机器有4个内核)时,它没有安排更多线程运行得更快?
答案 0 :(得分:1)
根据cppreference.com,当您未明确传递政策时:
1)与async(std :: launch :: async | std :: launch :: deferred,f,args ...)的行为相同。换句话说,f可以在另一个线程中执行,或者当查询结果std :: future时,它可以同步运行。
当两个标志都启用时:
如果在策略中设置了std :: launch :: async和std :: launch :: deferred标志,则由实现决定是执行异步执行还是延迟评估。
因此,不同之处在于默认情况下,策略是启动延迟或异步。选择取决于实施。当政策推迟时,那么lauch只能推迟。
我的问题是为什么在使用默认启动策略(我的机器有4个核心)时它没有安排更多线程运行得更快?
这不是必需的,并且实现选择不这样做。