2008-11-26 2 views
1

J'ai un problème de filetage,C# Threading, GetAvailableThreads()

J'installe le ThreadPool.SetMaxThreads(maxThreads, System.Environment.ProcessorCount) à 10.

Mais quand je vérifie combien sont avaliable ThreadPool.GetAvailableThreads() il dit qu'il ya (maxThreads - 1) Donc 9, mais ensuite utilise 10 threads.

Des idées pourquoi c'est?

Merci pour l'aide.

+1

C'est la troisième fois que vous posez cette question dans les 30 dernières minutes –

+0

C'est la deuxième fois que j'ai posé cette question, parce que vous avez décidé de fermer l'autre. C'est un problème DIFFÉRENT! –

+0

Je ne connais pas la réponse à la question, mais quel est le "problème" que vous dites que cela cause? Vous ne devriez pas vraiment vous tromper avec ces nombres ... si vous voulez un pool étranglé, vous devriez écrire le vôtre (ou attendre que .NET 4.0 arrive, puisque le CCR/TPL contient tel ...). –

Répondre

1

Dans un monde idéal, nous aurions 1 thread/noyau physique. De cette façon, nous n'aurions plus de commutateurs de contexte, qui sont des opérations plutôt coûteuses. Mais jusqu'à ce que nous ayons des processeurs avec des centaines de cœurs, ce ne sera pas pratique. Quoi qu'il en soit, comme Marc l'a suggéré, vous ne devriez pas jouer avec les paramètres de ThreadPool à moins que vous ne sachiez VRAIMENT ce que vous faites. La logique derrière l'implémentation .Net du ThreadPool est plutôt bonne, et elle peut gérer avec succès la plupart des scénarios.

1

Mettez-vous en file d'attente des tâches similaires?

ThreadPool.QueueUserWorkItem(callback, obj) 

puis faire quelque chose comme:

WaitHandle.WaitAll(WaitHandle) 

Je pense qu'il ya un problème avec la façon dont vous comptez réellement les fils qui sont en cours d'exécution, mais sans une explication plus précise de ce que vous re faire, c'est juste une supposition.

0

L'un des threads de pool de threads surveille les opérations d'attente des autres threads dans le pool de threads. Cela devrait expliquer le résultat maxthreads - 1.

Je ne sais pas pourquoi il semblerait utiliser tous les 10 threads alors. Il se peut qu'il utilise 9 pour votre travail, 1 pour surveiller et mettre en file d'attente l'autre.