2012-04-14 17 views
10

Sto iterando su un vettore di strutture ed elaborando ciascuna struttura singolarmente.
Sembra qualcosa di simile a questo:Ogni iterazione di un ciclo for/for_each può essere eseguita in parallelo? (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 

Il codice è molto lento perché doTask collega a particolari siti web e analizza HTML.
Quale sarebbe il modo migliore per velocizzarlo?
Il mio obiettivo è analizzare più DataT allo stesso tempo.
Sono molto nuovo al threading, ma std::async e std::future sembrano promettenti.

risposta

9

si può fare qualcosa di simile

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

Oppure si può usare qualcosa di più complicato come un filo di Intel Building Blocks e il parallel_for (non è che il nome?) La funzione della stessa.

+2

-1 l'esempio sarà totalmente sincrono in quanto il distruttore di 'std :: future' creato da' std :: async' verrà bloccato, inoltre questo non offre workstealing ecc. In realtà dovrebbe andare con la libreria di concorrenza. – inf

+1

@bamboon hai ragione, non avevo però dei distruttori del 'futuro's, buon punto. La mia comprensione della libreria di threading non comprendeva i future quando ho scritto questa risposta. L'ho modificato per essere corretto, penso. E l'OP non ha richiesto il workstealing. –

3

È sempre possibile utilizzare The Parallel Patterns Library (PPL) da Microsoft, se si sceglie Windows/VS2010 (o successivo). Ha parallel_for_each:

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

Stai utilizzando GCC? Le versioni recenti hanno una versione parallela di for_each (vedere here per come usarlo).

Problemi correlati