2011-01-29 122 views
3

我试图找出最基本的线程for循环的方法。例如,如果我有以下循环:在C++中为循环创建螺纹

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

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

理想情况下,我想要一些通用的(也许是模板的)方式去做这件事。即

threaded_for(0, n, doSomethingThreadSafe); 

如果最佳/最有效的方法是要使用一个库,有多少工作将需要添加库,以及如何准确地将它在这个例子中使用。不过,我更喜欢一种无需添加其他东西的解决方案。

+3

由于您不想使用外部库,您将无法使用[OpenMP](http://www.openmp.org/),这实际上就是您应该在这种情况下使用的。 – chrisaycock

+0

你在线程中实际做了什么?会不会有需要同步的共享资源? – ThomasMcLeod

+0

@ThomasMcLeod所有的东西都已经安装完毕,所以不需要同步。他们都会独立做事。 –

回答

5

最简单的方法是openMP - visual studio支持它作为标准,你只需在循环中添加一些魔术#pragma并使用你拥有的所有核心!学习

最好的办法是如何不这样做 - 32 OpenMP Traps For C++ Developers

一个选择 - 但稍微复杂的方法Intel TBB

2

到目前为止,最有效的方式来解决这个问题,假设doSomethingThreadSafe(i)是基本上是一个重复的指令(单指令多个数据)使用OpenMP作为chrisaycock说。

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

它实在不能简单得多。