169 votes

Nombre maximum de threads dans une application .NET?

Quel est le nombre maximum de threads que vous pouvez créer dans une application C#? Et que se passe-t-il lorsque vous atteignez cette limite? Est-ce qu'une exception de quelque sorte est lancée?

0 votes

La réponse sera différente si vous utilisez la machine virtuelle x64 ou la machine virtuelle x86

0 votes

Dans ma situation, c'est x86, mais pouvez-vous fournir la réponse pour les deux au cas où quelqu'un d'autre en aurait besoin ?

0 votes

Je manque d'une réponse à la question de ce qui se passe lorsque la limite est atteinte. L'application va-t-elle planter ou les threads resteront-ils dans la file d'attente?

167voto

Mitch Wheat Points 169614

Il n'y a pas de limite inhérente. Le nombre maximum de threads est déterminé par la quantité de ressources physiques disponibles. Consultez cet article de Raymond Chen pour des détails.

Si vous avez besoin de demander quel est le nombre maximum de threads, vous faites probablement quelque chose de mal.

[Mis à jour: Juste par curiosité : nombres par défaut de threads du pool de threads .NET :

  • 1023 dans Framework 4.0 (environnement 32 bits)
  • 32767 dans Framework 4.0 (environnement 64 bits)
  • 250 par cœur dans Framework 3.5
  • 25 par cœur dans Framework 2.0

(Ces nombres peuvent varier en fonction du matériel et du système d'exploitation)]

18 votes

Comment as-tu découvert cela? Sais-tu ce qu'est .NET 4.5, ou ce que sera le 5.0?

5 votes

Vous pouvez utiliser ce code pour obtenir les décomptes : int workerThreads; int completionPortThreads; ThreadPool.GetMaxThreads(out workerThreads, out completionPortThreads);

0 votes

@MitchWheat un résumé du lien serait génial, dans le cas où la page n'est plus disponible.

30voto

antonio Points 304

Mitch a raison. Cela dépend des ressources (mémoire).

Bien que l'article de Raymond soit dédié aux threads Windows, et non aux threads C#, la logique s'applique de la même manière (les threads C# sont mappés sur les threads Windows).

Cependant, comme nous sommes en C#, si nous voulons être totalement précis, nous devons distinguer entre les threads "démarrés" et "non démarrés". Seuls les threads démarrés réservent effectivement de l'espace de pile (comme on pourrait s'y attendre). Les threads non démarrés n'allouent que les informations requises par un objet thread (vous pouvez utiliser reflector si vous êtes intéressé par les membres réels).

Vous pouvez réellement le tester vous-même, comparez :

    static void DummyCall()
    {
        Thread.Sleep(1000000000);
    }

    static void Main(string[] args)
    {
        int count = 0;
        var threadList = new List();
        try
        {
            while (true)
            {
                Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
                newThread.Start();
                threadList.Add(newThread);
                count++;
            }
        }
        catch (Exception ex)
        {
        }
    }

avec :

    static void DummyCall()
    {
        Thread.Sleep(1000000000);
    }

    static void Main(string[] args)
    {
        int count = 0;
        var threadList = new List();
        try
        {
            while (true)
            {
                Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
                threadList.Add(newThread);
                count++;
            }
        }
        catch (Exception ex)
        {
        }
    }

Mettez un point d'arrêt dans l'exception (hors mémoire, bien sûr) dans VS pour voir la valeur du compteur. Il y a bien sûr une différence très significative.

12voto

MadApples Points 67

J'ai fait un test sur un système 64 bits avec console C#, l'exception est de type mémoire insuffisante, en utilisant 2949 threads.

Je réalise que nous devrions utiliser un pool de threads, ce que je fais, mais cette réponse est en réponse à la question principale ;)

10voto

Greg Hewgill Points 356191

Je caractériserais la densité de threads des applications de la manière suivante :

  • 1-2 threads : application de bureau
  • 10-20 threads : application serveur
  • 100-200 threads : application serveur très occupée (tournant sur un matériel multicœur sérieux)
  • 1000+ threads : ça n'arrive pas

6voto

Ian Boyd Points 50743

Vous devez utiliser le pool de threads (ou les délégués async, qui utilisent à leur tour le pool de threads) afin que le système puisse décider du nombre de threads à exécuter.

0 votes

La réponse est de laisser le système décider.

0 votes

@Ian: J'ai voté négativement votre réponse car la même réponse avait été donnée neuf mois plus tôt.

12 votes

Lien. je ne vois aucune mention de pool de threads dans la réponse de quelqu'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X