我试图找出基本上为for循环进行线程化的最佳方法。例如,如果我有以下循环:
for(int i = 0; i < n; i++)
doSomethingThreadSafe(i);
这将在Windows平台上。我已经为每个处理器创建了一个线程,然后尝试尽可能均匀地为每个处理器划分n。然后我将必要的数据传递给每个线程,然后使用WaitForMultipleThreads。有一个更好的方法吗?我不想使用像boost这样的任何其他库。
理想情况下,我想要一些通用的(也许是模板化的)方法来解决这个问题。即。
threaded_for(0, n, doSomethingThreadSafe);
如果最好/最有效的方法是使用库,那么添加库需要多少工作,以及在这个例子中它将如何使用。不过,我更喜欢一种不需要添加其他东西的解决方案。
答案 0 :(得分:5)
最简单的方法是openMP - visual studio支持它作为标准,你只需在循环中添加几个魔法#pragma并使用你拥有的所有核心!
最好的学习方法是如何不去做 - 32 OpenMP Traps For C++ Developers
另一种方法 - 但稍微复杂一点的方法Intel TBB
答案 1 :(得分:2)
到目前为止,解决此问题的最有效方法是,假设doSomethingThreadSafe(i)基本上是重复指令(对多个数据的单指令), 使用OpenMP作为chrisaycock说。
#pragma omp parallel for
for ( i = 0; i < n; i++ )
doSomethingThreadSafe(i);
真的,这不是那么简单。