17

May

Programmazione Parallela con .NET 4.0: Parte 1

Ciao a tutti,

oggi vorrei affrontare il discorso della programmazione parallela con .NET 4.0, infatti questa versione propone una libreria dedicata che ci facilita tantissimo la vita Sorriso! Iniziamo subito parlando in linea generale della programmazione parallela, spiegando la differenza tra Multithreading e Parallel Programming analizzando i vari benefici e la libreria offerta dal Framework.

Cos’è e Perchè

Non so se avete notato, ma la crescita in fattore di velocità dei processori si è arrestata, questo per motivi legati all’eccessiva riduzione delle dimensioni dei componenti interni delle CPU. Per non fermare lo sviluppo le case costruttrici stanno puntando a dividere la singola CPU in tante mini-CPU ed inglobarle in un unico processore per poter permettere la possibilità di far eseguire più operazioni in parallelo. Ecco che nasce l’esigenza di adattare i vari software a questa nuova tipologia di esecuzione in modo tale da consentire all’utente una esperienza totalmente diversa di utilizzo dell’applicazione e .Net Framework ci da una grossa mano.

Naturalmente c’è da prendere in considerazione che non sempre si può tratte vantaggio da questo tipo di programmazione, per esempio se dobbiamo eseguire un ciclo con poche operazioni, è sbagliato utilizzare la programmazione parallela perchè andremmo solo ad appesantire la gestione del ciclo senza ricavarne un vero beneficio, quindi valutate con attenzione dove utilizzarla.

clip_image001

Processore Multi-Core

Multithreading VS Parallel Programming

Il Multithreading si basa sull’utilizzo di un singolo core che “splitta” il suo carico su più thread. Anche se l’esecuzione dei vari thread può sembrare contemporanea, non è proprio così perchè in realtà in un medesimo istante possiamo avere in esecuzione soltanto un thread. Per avere la vera “contemporaneità” bisogna per forza spostarsi su processore multi-core e quindi sulla Parallel Programming che, grazie alle novità introdotte in .NET 4, ci consente l’uso di tutti i core disponibili gestendo equamente la suddivisione dei vari thread.

La Libreria

Task Parallel Library(d’ora in poi la chiameremo TPL) è il nome della libreria inclusa nel Framework 4 che ci permette di sfruttare la programmazione parallela.

In due namespace che contengono questa serie di set che dobbiamo utilizzare sono:

· System.Threading

· System.Threading.Tasks

La TPL si basa su un concetto di Task che può essere definito come un’operazione asincrona o anche come un’unità di lavoro. I Task, a differenza dei thread, hanno un controllo da codice maggiore (infatti possiamo gestire l’attesa del completamento, verificare lo stato di esecuzione, schedulare i task in maniera personalizzata, interrompere l’esecuzione e gestire in maniera robusta le eccezioni) e hanno un utilizzo più efficiente e scalabile delle risorse del sistema.

La TPL si divide in due rami: Parallelismo sui task ed il Parallelismo sui dati.

Parallelismo sui task

La TPL ci fornisce due metodi per creare task in parallelo:

· Utilizzando la classe Task

· Utilizzando il metodo statico Invoke presente nella classe Paralell.

Partiamo con un esempio, vedendo come utilizzare il metodo Invoke che accetta come parametro un Array di delegate di tipo Action:

Parallel.Invoke(() => MioMetodoUno(), () => MioMetedoDue(), () => MioMetedoTre());

I vari metodi verranno eseguiti in parallelo, sfruttando tutti i core disponibili. Il problema del metodo Invoke è la mancanza di gestione dei Task. Per avere un controllo maggiore dobbiamo per forza passare alla classe Task che ci permette di leggere lo Status, mettere in pausa l’esecuzione del task, attendere il termine dell’esecuzione di vari task e impostare varie proprietà durante la sua creazione. Vediamo degli esempi:

Utilizzo:

Task task1 = new Task(() => { MioMetodoUno(); });

task1.Start();

Verificare lo stato:

string stato = task1.Status.ToString();

Mettere in pausa:

task1.Wait();

Con questo concludiamo la prima parte, nella seconda parleremo del Parallelismo sui dati, LINQ e le altre novità introdotte.

Stay Tuned!

by Carmine Punella on 5/17/2012
Post archive