2016-11-14 1 views
3

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

Я пишу код последующих:

static void Main(string[] args) 
{ 
    Task t = new Task(() => DoWork()); 
} 

private static void DoWork() 
{ 
    //Do Something 
} 

DoWork запускается на резьбе из ThreadPool. для примера давайте предположим, что поток Num равен 3.

Мой вопрос: Существует вариант, что в середине Func DoWork, из-за переключения контекста и т.д.», непрерывной функции будет находиться в потоке, который является не 3?

Thank!

+0

Вы спрашиваете, будет ли переключение потока в середине обработки на другую тему? – Liam

+3

Нет, контекстный переключатель не означает, что он идет в другой поток, только этот процессор обрабатывает другой поток/логику для обработки, этот по-прежнему продолжается в одном и том же потоке –

+0

Возможный дубликат [контекстный переключатель потока и переключатель контекста процесса] (http://stackoverflow.com/questions/5440128/thread-context-switch-vs-process-context-switch) – Liam

ответ

4

Мой вопрос: есть вариант, что в середине func DoWork, из-за контекстного переключателя и т. Д., Непрерывная функция будет в потоке, которая не является 3?

Нет, контекстный переключатель не означает, что он идет в другую нить, только процессорное ядро ​​обрабатывает другой поток/логику для обработки, этот по-прежнему продолжается в одном потоке. Большинство потоков имеют одинаковый приоритет до тех пор, пока не запланировано CLR, как GC или ОС, которые будут иметь приоритет над другими потоками и заморозить все остальные потоки. Остальные все должны продолжать покидать процессорную ядро ​​после некоторой логической обработки, или я должен сказать, что ядро ​​процессора (логика планирования потоков) поддерживает планирование других потоков, таким образом, не голодая ни один из них. Пожалуйста, обратите внимание, в данный момент времени, процессор может только планировать одну нить/единицу работы

4

Мой Вопрос: Существует вариант, что в середине Func DoWork, из-за переключения контекста и т.д.», непрерывный функции будет в потоке, который не является 3?

No. С момента поток из пула потоков будет назначен для запуска кода DoWork, этот поток будет выполнять код и когда поток завершил свою работу поддержит в очередь, которая содержит другую работу, которую нужно запустить, чтобы получить следующую, если она вообще есть.

Что касается контекстного переключателя, это происходит не в потоке, а между двумя потоками. Каждое ядро ​​в CPU может выполнять только один поток за раз для временного фрагмента. У вас есть контекстный переключатель, когда работа одного потока не завершена в данном временном фрагменте. Таким образом, он должен быть приостановлен, а другой поток выполняется для его временного фрагмента. Тогда планировщик потоков планировал бы приостановленный поток для запуска в другое время.

+0

, если функция DoWork содержит некоторое ожидание. Пул потоков может использовать поток DoWork для другой задачи? – maz

+0

@maz насколько я знаю, нет. Это не похоже на потоки asp.net, где, когда они начинают обрабатывать веб-запрос, если код является асинхронным, и есть ожидание ввода-вывода, поток возвращается для обслуживания других веб-запросов, и когда IO будет завершен, продолжение будет выполнено в другом потоке, чтобы веб-запрос был полностью обработан. – Christos