我尝试测试我的编译器(mingw 6.3)在使用std :: thread创建大量线程时是否会生成std :: system_error,或者在使用std :: async创建任务时执行延迟任务。
...但是对于第一种情况,它将系统资源耗尽到系统(Windows 10)重新启动时(我测试了两次)。另外std :: async在我看来行为不端,因为它没有产生延迟的任务 - 系统严重减速,但不会重新启动。
标准允许这种行为吗?我知道我应该检查延迟的任务,但是在我看来,即使在生成125000个线程之后它也无法再现,很难测试这个代码路径。我不是说我的应用程序会生成这么多线程,但是其他一些进程可能会在后台滥用系统资源。
以下代码示例。
用于生成大量线程的示例代码(在mingw 6.3下,windows 10以系统重启结束!)
std::vector<std::thread> th_vec;
std::atomic<bool> wait(true);
for(std::size_t i= 0; ; ++i) {
th_vec.emplace_back([&](){ while(wait){ std::this_thread::sleep_for(100ms); }});
if ((th_vec.size()%100) == 0) {
std::cout << "#" << (th_vec.size() / 100) << " th_vec.size() = " << th_vec.size() << "\n";
}
}
和基于任务的方法:
std::vector<std::future<void>> fut_vec;
std::vector<std::future<void>> fut_vec_defered;
std::atomic<bool> wait(true);
for(std::size_t i= 0; ; ++i) {
auto fut = std::async([&](){ while(wait){ std::this_thread::sleep_for(100ms); }});
if (fut.wait_for(0s) == std::future_status::deferred) {
// in my tests task is never deferred, even if 126K threads are generated
fut_vec_defered.emplace_back(std::move(fut));
} else
fut_vec.emplace_back(std::move(fut));
if ((i % 100) == 0) {
std::cout << "#" << (i / 100) << " fut_vec.size() = " << fut_vec.size() << ", fut_vec_defered.size() = " << fut_vec_defered.size() << "\n";
}
}