Переключатели контекста потока задач - PullRequest
5 голосов
/ 05 декабря 2011

Я читал и читал, что если я использую Задачи вместо потоков в .Net, они не будут восприимчивы к переключениям контекста, с которыми у потоков возникают проблемы.

Однако, читая вокруг, я также заметил, что в любом случае Задачи просто используют потоки под обложками.

Так что я немного смущен, любые разъяснения приветствуются.

Ответы [ 2 ]

10 голосов
/ 05 декабря 2011

То, что вы прочитали, неверно.

Task является частью TPL.TPL использует более продвинутый планировщик, чем пул потоков CLR.Например, планировщик TPL использует WorkStealingQueues.

Несколько фактов:

  • Независимо от того, выполняете ли вы Task.Factory.StartNew,или ThreadPool.QueueUserWorkItem, оба будут использовать один и тот же пул потоков (.NET 4.0)
  • Независимо от того, используете ли вы потоки Task или "raw", каждый временной интервал вызовет переключение контекста.
  • Также, если поток с более высоким приоритетом станет работоспособным, это вызовет переключение контекста.
  • A Task вызовет столько же переключений контекста, сколько и обычный поток.

Обратите внимание, что переключение контекста происходит только в том случае, если недостаточно процессоров для одновременной обработки потоков.

Некоторые ссылки для проверки:

1 голос
/ 05 декабря 2011

Переключение контекста не присуще потокам, а присуще неправильному использованию потоков.Задачи используют потоки таким образом, чтобы независимо от того, какой поток выполнялся, он мог выполнять любую задачу, необходимую для выполнения, избегая дорогостоящих переключений контекста, возникающих при неправильном использовании потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...