【问题标题】:Can each Iteration of a for loop/for_each be done in parallel? (C++11)for 循环/for_each 的每个迭代可以并行完成吗? (C++11)
【发布时间】:2012-04-14 16:53:00
【问题描述】:

我正在迭代结构向量并单独处理每个结构。
它看起来像这样:

for_each(begin(data),end(data),DoTask);
//assume "data" is std::vector<DataT>  
//assume DoTask is a function that takes a DataT by reference

代码非常慢,因为 DoTask 连接到特定网站并分析 HTML。
加快速度的最佳方法是什么?
我的目标是同时分析多个 DataT。
我对线程很陌生,但 std::asyncstd::future 看起来很有希望。

【问题讨论】:

    标签: c++ asynchronous c++11 parallel-processing future


    【解决方案1】:

    你可以这样做

    for(T& d : data) std::thread(DoTask, d).detach();
    

    或者你可以使用更复杂的东西,比如英特尔的线程构建块和parallel_for(不是这个名字吗?)函数。

    【讨论】:

    • -1 该示例将完全同步,因为从std::async 创建的std::future 的析构函数将阻塞,此外这不提供任何工作窃取等。On 应该与并发库一起使用。跨度>
    • @bamboon 你是对的,我没有想到futures 的析构函数,好点。当我写这个答案时,我对线程库的理解不包括未来。我认为,我已将其修改为正确的。而且 OP 不需要偷工减料。
    【解决方案2】:

    您在使用 GCC 吗?最近的版本有for_each 的并行版本(请参阅here 了解如何使用它)。

    【讨论】:

      【解决方案3】:

      如果您面向 Windows/VS2010(或更高版本),您始终可以使用来自 Microsoft 的 The Parallel Patterns Library (PPL)。它有parallel_for_each:

      parallel_for_each(values.begin(), values.end(), [] (int& value)
      {
        value *= 2;
      });
      

      【讨论】:

        猜你喜欢
        • 2019-07-15
        • 1970-01-01
        • 2021-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-08
        • 1970-01-01
        相关资源
        最近更新 更多