Multithreading e parallel computing nel .NET Framework 4.0
Una delle novità dell'imminente nuova versione del .NET Framework a cui personalmente ho dato parecchia importanza è il notevole supporto per multithreading e parallel computing. Spesso siamo abituati a confondere questi due termini e a usarli quasi come sinonimi, anche se sinonimi veri e propri non sono. Il multithreading è un qualcosa che è sui nostri desktop già da diversi anni, supportato dal Framework sin dalle sue prime incarnazioni. Il calcolo parallelo è invece qualcosa di più, che sfrutta il multithreading per massimizzare l'uso dei core messi a disposizione dall'hardware, un aspetto fondamentale nel momento in cui anche sui laptop non è raro imbattersi in 4, 6 o 8 core.
Ho avuto modo di occuparmi di questi aspetti durante la stesura di uno dei capitoli dei nostri libri di prossima uscita interamente dedicato alle tematiche di multithreading e parallel computer, e penso francamente che il .NET Framework 4.0, il nuovo CLR e Visual Studio 2010 portino l'esperienza di sviluppo di applicazioni parallele a livelli assolutamente ineguagliati al giorno d'oggi.
Ma quali sono sostanzialmente queste novità? Beh. innanzitutto direi la presenza di PLINQ e della classe ParallelQuery, grazie alla quale è possibile integrare con grandissima facilità il calcolo parallelo all'interno delle nostre query LINQ; basta usare infatti l'extension method AsParallel() per far sì che una query del tipo
var query = from i in list.AsParallel() where someCondition(i) select someResult(i)
venga eseguita sfruttando al massimo i core presenti nel sistema.
Per il codice "di tutti i giorni", invece, sono state introdotte le classi Task e TaskFactory, che rendono possibile creare task asincroni, gestirne le notifiche, accodarne di altri, ecc.. in una sintassi estremamente concisa e intuitiva, che ci risparmia un bel po' di lavoro manuale che eravamo costretti a svolgere usando il ThreadPool.
Ma più thread contemporaneamente in esecuzione vuol dire anche gestire problematiche di concorrenza e di thread safety. Chi ha lavorato in quest'ambito in passato, sa che ad esempio avere a che fare con collection condivise tra più thread non era assolutamente banale. Il .NET Framework 4.0 espone un nuovo namespace, dal nome fin troppo indicativo: System.Collections.Concurrent. Esso contiene un gran numero di collection, tutte rigorosamente thread safe, che risparmiano parecchie grane quando utilizzate in scenari paralleli e i cui internals (basta dare un'occhiata con Reflector) sono tutt'altro che banali e scontati, con lo scopo di minimizzare i lock, che notoriamente vanno a braccetto con decadimenti prestazionali.
E la ciliegina su questa torta non poteva che essere lui, Visual Studio 2010, e il suo supporto al debug di applicazioni multithreaded. Provate a dare un'occhiata a queste due immagini in basso per capire di cosa sto parlando, valgono più di mille parole:
Che dire. ci aspettano non solo mesi di articoli e succose novità, ma anche mesi in cui potremo sfruttare strumenti innovativi, in grado di darci una grande mano nel lavoro di tutti i giorni e, perché no, anche vantaggi sostanziali nelle potenzialità delle nostre applicazioni!
Ci vediamo su queste pagine!











