C++ 2011:std::thread:并行化循环的简单示例?

标签 c++ multithreading c++11

C++ 2011 包含非常酷的新功能,但我找不到很多并行化 for 循环的示例。 所以我非常幼稚的问题是:如何将简单的 for 循环(例如使用“omp parallel for”)与 std::thread 并行化? (我搜索了一个例子)。

非常感谢。

最佳答案

std::thread 不一定意味着并行循环。它旨在作为构建类似 parallel_for 算法的结构的低级抽象。如果你想并行化你的循环,你应该自己编写一个 parallel_for 算法,或者使用提供基于任务的并行性的现有库。

以下示例展示了如何使简单循环并行化,但另一方面也展示了缺点,例如缺少负载平衡和简单循环的复杂性。

  typedef std::vector<int> container;
  typedef container::iterator iter;

  container v(100, 1);

  auto worker = [] (iter begin, iter end) {
    for(auto it = begin; it != end; ++it) {
      *it *= 2;
    }
  };


  // serial
  worker(std::begin(v), std::end(v));

  std::cout << std::accumulate(std::begin(v), std::end(v), 0) << std::endl; // 200

  // parallel
  std::vector<std::thread> threads(8);
  const int grainsize = v.size() / 8;

  auto work_iter = std::begin(v);
  for(auto it = std::begin(threads); it != std::end(threads) - 1; ++it) {
    *it = std::thread(worker, work_iter, work_iter + grainsize);
    work_iter += grainsize;
  }
  threads.back() = std::thread(worker, work_iter, std::end(v));

  for(auto&& i : threads) {
    i.join();
  }

  std::cout << std::accumulate(std::begin(v), std::end(v), 0) << std::endl; // 400

使用提供 parallel_for 模板的库,可以将其简化为

parallel_for(std::begin(v), std::end(v), worker);

关于C++ 2011:std::thread:并行化循环的简单示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10792157/

相关文章:

c++ - 使用 std::set of pointers 时出现段错误...谁能解释一下?

c++ - Directx 11 内存管理

java - 带监听器的单例与连接

c++ - 真的需要 constexpr 吗?

C++11 initializer_list 错误

c++ - 尝试使用指向结构 vector 的指针访问结构类型时出错

c# - 如何在C#中将参数传递给异步任务

ruby-on-rails - 设置 Sidekiq :concurrency on Heroku

c++ - 我如何在 C++11 中定义负 UDL(它们是否被禁止?)?

c++ - boost 侵入式指针