26

May

Programmazione Parallela con .NET 4.0: Parte 2

Ciao a tutti,

 

riprendiamo il discorso iniziato nel precedente post, continuando a parlare della programmazione parallela con .NET 4 e di come sfruttare il parallelismo sui dati.

Per poter usufruire di quest'ultimo, possiamo utilizzare la classe Parallel ed i metodi statici For e Foreach oppure PLINQ.

I primi non sono altro che la controparte parallela dei due costrutti for e foreach che già conosciamo.

Vediamo un esempio:

Supponendo di avere un metodo chiamato ExampleMethodA.

For:

Parallel.For(0,100, ExampleMethodA);

Per il ciclo foreach supponiamo di avere un ExampleMethodA che accetta come parametro un char.

Foreach:

String text = "ciao";

Parallel.Foreach(text, ExampleMethodB);

Passando la stringa come primo parametro, per ogni carattere della stringa, verrà eseguito il metodo passandogli come parametro del metodo ExampleMethodB il char corrispondente. Un problema nell'utilizzo di questi due metodi è che l'ordine di esecuzione dei cicli è sconosciuto. I vantaggi però sono molti, in maniera automatica e trasparente, la TPL gestisce gli eventuali lock, partiziona in automatico la collection e crea i thread necessari all'esecuzione del ciclo.

Parallel LINQ

Anche qui, .NET 4.0 ha portato grandi novità e una di queste è proprio  la possibilità di eseguire le query LINQ in parallelo. Tutte le funzionalità di PLINQ sono contenute nel namespace System.LINQ.ParallelEnumerable che contiene tutti i query operator di LINQ to Object ma in versione parallela. La semplicità per trasformare una query da normale a parallela è disarmante, infatti basta aggiungere .AsParallel() alla fine della query. Non è detto che tutte le query vengano eseguire in parallelo perchè PLINQ analizza a runtime la query creata e valuta se conviene eseguire la query parallelizzata. Nel caso, per qualsiasi motivo, vogliamo forzare l'esecuzione della query in paralello allora dobbiamo richiamare il metodo WithExecutionMode in questo modo:

var people = from person in people.AsParallel().WithExecutionMode(ParallelExectuionMode.ForceParallelism)

where person.name == "ciao"

select person;

Le Concurrent Collection

Nel namespace System.Collections.Concurrent troviamo nuove collection che gestiscono in maniera automatica l'aggiunta e la rimozioni di elementi in modalità thread-safe, ecco una lista con i link ai dettagli

Con questo è tutto.

Alla prossima

 

Carmine

by Carmine Punella on 5/26/2012
Post archive