2013-08-21 10 views
2

De here.Net 4 Clarification de la planification des tâches?

Le .NET Framework fournit des files d'attente de tâches locales pour chaque thread de travail dans le fil pool.Giving différentes parties de l'application de leurs propres files d'attente permet d'éviter un goulot d'étranglement central (par pas accès au monde queue).

enter image description here

Je suppose que les files d'attente sont pour les nouvelles tâches qui vient du thread de travail et non d'un fil régulier.

Question:

Mais pourquoi la file d'attente (dans chaque thread de travail) est en cours d'exécution des tâches locales d'une manière LIFO? où est l'équité? Une tâche qui a été mise en file d'attente plus tôt devrait s'exécuter plus tôt (FIFO).

Qu'est-ce qui me manque?

+1

La classe Tâche souffre d'avoir été entre les mains d'architectes astronautes. Rien de spécial ne se passe ici, les sous-tâches que vous ajoutez avec ContinueWith() fonctionnent dans l'ordre. –

Répondre

3

Les tâches qui venaient juste d'être mises en file d'attente ont probablement leur jeu de mémoire de travail toujours dans le cache de l'UC (par exemple, le tri rapide récursivement les parties d'un tableau à trier). Le LIFO favorise la réutilisation des caches et réduit l'équité. Mais la TPL ne garantit pas l'équité de toute façon, et je vois peu d'applications qui en auraient besoin.

+1

Et si vous voulez l'équité, il y a ['TaskCreationOptions.PreferFairness'] (http://blogs.msdn.com/b/pfxteam/archive/2009/07/07/9822857.aspx) (qui place la' Task' à la file d'attente FIFO globale). – svick

+0

@svick Êtes-vous en train de dire que si j'ouvre une sous-tâche (à partir d'un thread de travail) et que vous définissez 'PreferFairness', elle ira à la queue Global? (J'ai pensé qu'il devrait aller à la file d'attente locale) –

+0

@RoyiNamir Oui, c'est exactement ce que cette option est pour (lire l'article auquel je suis lié). – svick

Questions connexes