创建太多线程

时间:2017-04-16 22:57:21

标签: c++ multithreading

我尝试测试我的编译器(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";
    }
  }

0 个答案:

没有答案