2012-04-14 5 views
10

Estoy iterando sobre un vector de estructuras y procesando cada estructura de forma individual.
se ve algo como esto:¿Puede cada iteración de un for loop/for_each hacerse en paralelo? (C++ 11)

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

El código es significativamente más lento porque doTask conecta a determinadas páginas web y analiza HTML.
¿Cuál sería la mejor manera de acelerar esto?
Mi objetivo es analizar múltiples DataTs al mismo tiempo.
Soy muy nuevo en el roscado, pero std::async y std::future parecen prometedores.

Respuesta

9

Usted puede hacer algo como esto

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

o se puede usar algo más complicado como el hilo de Intel bloques de construcción y la parallel_for (no es que el nombre?) En función de ello.

+2

-1 el ejemplo será totalmente sincrónico ya que el destructor de 'std :: future' creado a partir de' std :: async' se bloqueará, además esto no ofrece ningún tratamiento, etc. En realidad debería ir con la biblioteca de concurrencia. – inf

+1

@bamboon tienes razón, no había pensado en los destructores del 'futuro', buen punto. Mi comprensión de la biblioteca de threading no abarcó futuros cuando escribí esta respuesta. Lo he corregido para que sea correcto, creo. Y el OP no requirió protección laboral. –

3

Siempre puede usar The Parallel Patterns Library (PPL) de Microsoft, si se dirige a Windows/VS2010 (o posterior). Tiene parallel_for_each:

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

¿Está utilizando GCC? Las versiones recientes tienen una versión paralela de for_each (ver here para saber cómo usarla).

Cuestiones relacionadas