Microsoft .NET 4.0 introduit de nouvelles "améliorations parallèles" à son cadre. Je me demande quelle est la différence entre une application qui utilise les fonctions standard de System.Threading et les nouvelles améliorations parallèles.
Réponses
Trop de publicités?La différence la plus importante entre les extensions parallèles et le threading classique est probablement le flux de contrôle.
Un fil, créé à l'aide de new Thread(...)
o ThreadPool.QueueUserWorkItem
se terminera à un moment complètement indéterminé dans le temps. Si vous écrivez ce code :
ThreadPool.QueueUserWorkItem(() =>
{
Thread.Sleep(1000);
Console.WriteLine("Work Finished");
});
Console.WriteLine("Item Queued");
Le texte Item Queued
apparaîtra tout de suite, et Work Finished
sera imprimé après un délai d'environ 1 seconde.
D'autre part, si vous écrivez quelque chose de similaire en utilisant des extensions parallèles :
Parallel.For(0, 10, i =>
{
Thread.Sleep(1000);
Console.WriteLine("Test {0}", i);
});
Console.WriteLine("Finished");
Ce que vous verrez dans ce cas, c'est un délai d'une seconde avant que quelque chose ne se passe, puis une série de messages "Test" dans un ordre aléatoire, et puis le texte Finished
.
En d'autres termes, l'exécution de tâches en parallèle ne modifie pas réellement le déroulement du programme. Il exécutera différentes tâches sur différents threads afin qu'elles puissent être exécutées sur plusieurs cœurs de CPU, dans le but d'améliorer le débit global du programme, mais pour le programmeur typique, ces tâches ne s'exécutent pas vraiment en "arrière-plan" comme elles le feraient avec un thread. Vous n'avez pas à modifier la structure de votre programme ou à faire quoi que ce soit de spécial pour être informé de la fin du travail. Vous n'avez aucun contrôle sur ce qui se passe à l'intérieur de le bloc parallèle, mais vous savez que le bloc ne rendra pas le contrôle tant que toutes les tâches parallèles ne seront pas terminées.
Bien que les extensions parallèles soient excellentes pour cela, il convient de mentionner que les PX ne sont d'aucune utilité lorsque l'on veut réellement besoin de pour exécuter une tâche en arrière-plan, comme la mise en œuvre d'un planificateur, ou la délégation à un fil de travail afin de maintenir une interface utilisateur réactive. Pour cela, vous devez toujours utiliser des threads ou des composants asynchrones.
Voici une bonne chaîne9 que j'ai regardée il y a quelque temps sur ce sujet : http://channel9.msdn.com/posts/philpenn/Parallel-Programming-with-NET-Parallel-Extensions/
Le cadre parallèle utilise le modèle de filetage .NET qui, à son tour, s'appuie sur le modèle de filetage de Windows. Cependant, de nombreuses optimisations ont été réalisées dans le cadre général afin de rendre la bibliothèque parallèle plus efficace.
Ce blog a des détails supplémentaires.