【问题标题】:Threaded for loop in c++c++中的线程for循环
【发布时间】:2011-06-17 15:18:07
【问题描述】:

我正在尝试找出基本上线程化 for 循环的最佳方法。例如,如果我有以下循环:

for(int i = 0; i < n; i++)
  doSomethingThreadSafe(i);

这将在 Windows 平台上。我一直在为每个处理器创建一个线程,然后尝试为每个处理器尽可能均匀地划分 n。然后我将必要的数据传递给每个线程,然后使用 WaitForMultipleThreads。有一个更好的方法吗?我不想使用任何其他库,例如 boost。

理想情况下,我想要一些通用的(可能是模板化的)方法来解决这个问题。即

threaded_for(0, n, doSomethingThreadSafe);

如果最好/最有效的方法是使用库,添加库需要做多少工作,以及在此示例中将如何使用它。不过,我更喜欢不需要添加其他内容的解决方案。

【问题讨论】:

  • 由于您不想使用外部库,因此您将无法使用 OpenMP,这正是您在这种情况下应该使用的。
  • 您在线程中实际在做什么?会有需要同步的共享资源吗?
  • @ThomasMcLeod 一切都已设置好,因此不需要同步。他们都将独立做事。
  • 那么,有什么问题吗?你想平均分配工作吗?
  • parallel_for 能帮到你吗? msdn.microsoft.com/en-us/library/dd505035.aspx

标签: c++ windows multithreading for-loop


【解决方案1】:

最简单的方法是 openMP - Visual Studio 将其作为标准支持,您只需在循环中添加几个魔术 #pragma 并使用您拥有的所有内核!

最好的学习方法是如何不去做 - 32 OpenMP Traps For C++ Developers

另一种-但稍微复杂一点的方法Intel TBB

【讨论】:

    【解决方案2】:

    到目前为止,解决此问题的最有效方法,假设 doSomethingThreadSafe(i) 基本上是重复指令(多数据上的单个指令)按照 chrisaycock 所说的那样使用 OpenMP。

    #pragma omp parallel for
    for ( i = 0; i < n; i++ )
        doSomethingThreadSafe(i);
    

    真的,没有比这更简单的了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多