Est-ce que quelqu'un sait? Et une plus grande question est ce qui se passe lorsque vous rencontrez ce maximum? Est-ce le même numéro avec d'autres systèmes d'exploitation Windows tels que Vista, XP, etc.?
Premièrement, je vous conseillerais de lire ceci: http://blogs.msdn.com/oldnewthing/archive/2007/03/01/1775759.aspx
then http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx
Pour résumer, la limitation est normalement l’espace de pile (qui doit être composé de blocs contigus) et, comme chaque thread le consomme dispersé, vous manquez rapidement de blocs contigus . Sur les machines 64 bits et les systèmes .
Les stratégies d'atténuation existent mais n'iront que très loin (et ne vous fiez pas à l'utilisation de beaucoup de piles par thread)
À titre indicatif:
De toute façon, vous n’auriez probablement pas besoin de créer plus de dix (et si vous avez vraiment besoin de le savoir, vous devriez déjà connaître cette information).
La meilleure réponse que j'ai entendue en posant de telles questions est:
Cela n'a pas d'importance, et si vous trouvez que c'est le cas, vous devez repenser ce que vous faites pour que ce ne soit pas grave.
Notez que vous devriez examiner votre conception de près si vous êtes préoccupé par le fait d'atteindre cette limite !!!!!!!!
La réponse à votre "question plus importante" de ce qui se passe est OutOfMemoryException.
Pas exactement une réponse directe, mais voici un code pour connaître la limite. Cela pourrait cependant dépendre de la mémoire disponible. Serait intéressé à voir d'autres résultats OS/cpu/mem.
N'hésitez pas à éditer et ajouter votre machine dans:
Windows 7, VS2008, dual core, 2 Go de mémoire: 1 465 puis planter avec OutOfMemoryException
int i = 0;
try
{
while (true)
{
new Thread(new ThreadStart(() => Thread.Sleep(int.MaxValue))).Start();
i++;
}
}
catch (Exception ex)
{
Console.WriteLine(i);
Console.WriteLine(ex.ToString());
}
Autant que je sache, le modèle de threading dans son ensemble ne devrait pas avoir beaucoup changé depuis Win2K.
Il n'y a pas de réelle limite de threads en soi, mais plutôt une limite d'espace de pile de processus. Voir une explication détaillée des limites de thread de Raymond Chen pour plus de détails à ce sujet.
Lisez les billets de blog de Raymond Chen que la réponse de ShuggyCoUk a pointés.
Mais faites particulièrement attention à ce bit:
Mais la vraie question qui se pose chaque fois que quelqu'un demande: "Quel est le nombre maximal de threads qu'un processus peut créer?" est "Pourquoi créez-vous tant de threads que cela devient même un problème?"
Le modèle "un thread par client" est bien connu pour ne pas évoluer au-delà d’une douzaine de clients environ. Si vous envisagez de gérer simultanément plus d'un grand nombre de clients, vous devez passer à un modèle dans lequel, au lieu de dédier un fil à un client, vous allouez un objet. (Un jour, je parlerai de la dualité entre les threads et les objets.) Windows fournit des ports de complétion E/S et un pool de threads pour vous aider à convertir un modèle basé sur les threads en modèle basé sur un élément de travail.
Si vous êtes coincé avec une conception existante qui utilise un grand nombre de threads et doit évoluer, vous pouvez également envisager les fibres:
http://msdn.Microsoft.com/en-us/library/ms682661%28v=vs.85%29.aspx
Cela peut vous faire économiser une refonte totale.
Indy l’a envisagé pour Indy 10, mais cela ne s’est jamais produit, semble-t-il.
La question semble très ancienne, mais j'aimerais ajouter ce qui peut être utile aux autres:
Cet article concernant: Repousser les limites de Windows: processus et threads
http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx
La taille de pile par défaut est de 1 Mo et l'espace d'adressage en mode utilisateur attribué au processus Windows sous le système d'exploitation Windows 32 bits est d'environ 2 Go. qui permettent environ 2000 threads par processus (2000 * 1 Mo = 2 Go). pour 64 bits, pratiquement, il n'y a pas un tel problème.