2013-08-21 2 views
2

От here.Net 4 Расписание планирования задачи?

В .NET Framework предоставляет локальные очереди задач для каждого рабочего потока в потоке pool.Giving различных частей приложения, их собственная очередь работы помогает избежать центральное узкого места (путем не доступ к глобальному очередь).

enter image description here

Я предполагаю, что эти очереди для новых задач, которые исходят от рабочего потока, а не от обычной нити.

Вопрос:

Но почему же очереди (в каждом рабочем потоке) работают локальные задачи в LIFO образом? где справедливость? Задача, поставленная раньше, должна выполняться раньше (FIFO).

Что мне не хватает?

+1

Класс Task страдает от того, что он был в руках астронавтов-архитекторов. Здесь ничего особенного не происходит, подзадачи, которые вы добавляете с помощью ContinueWith(), выполняются по порядку. –

ответ

3

Задачи, которые были просто поставлены в очередь, скорее всего, будут иметь свой рабочий набор памяти в кэше ЦП (например, Быстрая сортировка рекурсивно выделенных частей массива, подлежащего сортировке). LIFO способствует повторному использованию кеш-кода и снижает справедливость. Но TPL не гарантирует справедливости в любом случае, и я вижу несколько приложений, которые в этом нуждаются.

+1

И если вы хотите справедливости, есть ['TaskCreationOptions.PreferFairness'] (http://blogs.msdn.com/b/pfxteam/archive/2009/07/07/9822857.aspx) (который ставит' Задача' к глобальной очереди FIFO). – svick

+0

@svick Вы хотите сказать, что если я открою подпрограмму (из рабочего потока) и задаю 'PreferFairness', она перейдет в очередь Global? (Я думал, что он должен пойти в локальную очередь) –

+0

@RoyiNamir Да, это именно то, для чего этот вариант (прочитайте статью, к которой я привязался). – svick

Смежные вопросы