ThreadPool max threads

j'ai quelques problèmes avec le ThreadPool de .NET (.NET 4).

j'ai lu que par défaut .NET a une limite de 25 threads par processeur, mais selon les messages de forum sur SO et sur d'autres endroits, je peux augmenter la limite avec le code ci-dessous.

void SetThreads(int threads)
{
    ThreadPool.SetMaxThreads(threads, threads);
    ThreadPool.SetMinThreads(threads, threads);
}

cependant, quand je mets le nombre ci-dessus à un nombre arbitrairement élevé, par exemple, 2000, et la file d'attente ~1000 articles, je n'ai encore que ~33 threads en cours d'exécution( .NET CLR prend ~5 threads), et ThreadPool.GetAvailableThreads() retourne les fils de 1971 restant.

pourquoi le code ci-dessus ne fonctionne-t-il pas?

26
demandé sur foxy 2011-05-14 13:04:58

3 réponses

MSDN:

Quand la demande est faible, le nombre réel de pool de threads peut tomber ci-dessous les valeurs minimales.

Lire ceci: Modèles de Programmation Parallèle: la Compréhension et l'Application de Modèles Parallèles avec la .NET Framework 4

8
répondu Erno de Weerd 2017-09-22 08:11:41

premièrement, votre "connaissance" des valeurs par défaut est incorrecte. La limite de 25 threads par processeur était revenue de .NET 1.1. Il a été augmenté dans .NET 2,et:

à partir de la version 4 du Framework.net, la taille par défaut du pool de threads pour un processus dépend de plusieurs facteurs, tels que la taille de l'espace d'adresse virtuel. Un processus peut appeler la méthode GetMaxThreads pour déterminer le nombre de threads.

Cependant, il y a autre chose en jeu: le thread pool ne fait pas créer de nouveaux threads dans toutes les situations. Afin de faire face à des rafales de petites tâches, il limite la vitesse à laquelle il crée de nouveaux fils. IIRC, il va créer un thread toutes les 0.5 secondes s'il ya des tâches en suspens, jusqu'au nombre maximum de threads. Je ne peux pas voir immédiatement cette figure documentée cependant, de sorte qu'il peut bien changer. Je soupçonne fortement qu'est ce que vous voyez. Essayez de faire la queue avec beaucoup d'articles et puis suivre le nombre de threads au fil du temps.

72
répondu Jon Skeet 2011-05-14 09:14:14

tout d'Abord vérifier ce lien, surtout cette remarque:

si le langage courant runtime est hébergé, par exemple par Internet Services d'Information (IIS) ou SQL Server, l'hôte peut limiter ou prévient les changements dans la taille du pool de threads.

Ensuite, vous devriez vérifier la valeur de retour de ThreadPool.SetMaxThreads(threads, threads) méthode. Peut-être qu'il retourne false?

1
répondu Grook 2017-09-22 08:12:22