2009-04-04 6 views
3

J'ai un cpu multi-core mais l'application .net que j'ai écrit n'utilise qu'un des cœurs. comment puis-je lui faire utiliser plus d'un noyau lorsque cette option est disponible.application .net multi-threading

Répondre

7

Cela ne se produit pas gratuitement. L'utilisation de plusieurs cœurs nécessite l'utilisation de plusieurs threads. Vous devrez ajouter explicitement le support de threads à votre programme afin d'utiliser plusieurs cœurs simultanément.

Voici un excellent article expliquant comment tirer parti de plusieurs cœurs avec du code managé en utilisant la bibliothèque parallèle de tâches (également connue sous le nom de parallel extensions framework).

http://msdn.microsoft.com/en-us/magazine/cc163340.aspx

4

Vous pouvez essayer le Microsoft Parallel Extensions to .NET Framework 3.5 comme JaredPar mentionné, ou créer une version multithread de votre programme par vous-même.

Je voudrais ajouter un exemple plus concret ici à propos de la facilité avec laquelle il est possible de convertir une "boucle for" d'un programme existant pour utiliser System.Threading.Parallel depuis l'Extension Parallèle. Pour une boucle for qui vérifient tous les premiers entre 0 à maxnum:

System.Threading.Parallel.For(0, maxNum + 1, x => IsPrime(x)); 

Facile, non?

Je réalise également un simple benchmark sur l'amélioration des performances de System.Parallel. J'espère que les pairs ne me dérange pas si je poste un lien vers mon blog here.

alt text

0

@JaredPar donne une excellent answer. Dans certaines circonstances, cependant, il ne vaut peut-être pas la peine de réécrire le code pour qu'il soit multithread. Le code multithread est plus compliqué et ajoute un tas de types de bogues supplémentaires avec lesquels lutter. Cependant, dans le cas simple d'une application de bureau, il vaut parfois la peine de laisser le deuxième noyau d'une machine à double cœur libre, de sorte que le système d'exploitation puisse l'utiliser pour redessiner l'écran pour d'autres applications, le scanner de virus, etc.

Pas la réponse que vous vouliez particulièrement entendre, mais une réponse pragmatique dans certains cas.

0

Distribuez vos tâches intensives en plusieurs threads.

La méthode suggérée pour le multitreading consiste à utiliser ThreadPool.

Un échantillon de ThreadPool de MSDN:

using System; 
using System.Threading; 
public class Example { 
    public static void Main() { 

     // Queue the task. 
     ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc)); 

     Thread.Sleep(1000); 

     Console.WriteLine("Main thread exits."); 
    } 

    // This thread procedure performs the task. 
    static void ThreadProc(Object stateInfo) { 

     // No state object was passed to QueueUserWorkItem, so 
     // stateInfo is null. 
     Console.WriteLine("Hello from the thread pool."); 
    } 
}