2014-10-03 4 views
17

Похоже, что класс Task предоставляет нам возможность использовать несколько процессоров системы. Работает ли класс Thread на нескольких процессорах, или он использует временную разбивку только на одном процессоре? (Предполагая систему с несколькими ядрами).Выполняются ли потоки на нескольких процессорах?

Мой вопрос в том, будут ли потоки выполняться или будут выполняться на нескольких ядрах, а что же особенного в задаче и параллелизме?

+0

Это, вероятно, O/S зависима и не определяется рамками .Net. Было бы хорошо знать наверняка. – Polyfun

+2

Имейте в виду, что Задачи по умолчанию предназначены для действительно быстрых задач (менее 200 мс); поэтому параллелизм с параллельным вычислением/параллелизм не должен быть большим требованием. Если вы * хотите * хотеть иметь параллельные параллельные/параллельные, длительные задачи, связанные с вычислением, предпочитайте Task.Run над TaskFactory.StartNew и будьте в курсе использования перегрузки, которая принимает 'TaskCreationOptions' и использует' TaskCreationOptions.LongRunning'. В противном случае могут возникнуть неблагоприятные последствия для пула потоков, которые могут привести к сбою в параллелизме. –

+0

Возможно, связано: http://stackoverflow.com/q/12328751 – stakx

ответ

11

-It кажется, что класс задач дают нам возможность использовать на нескольких процессорах в системе.

-если потоки будут выполняться или выполняться на нескольких ядрах, то что же такого особенного в Параллелизме задач?

Класс Task - это небольшая, но важная часть TPL (параллельная библиотека задач). TPL - это абстракция высокого уровня, поэтому вам не нужно напрямую работать с потоками. Он инкапсулирует и скрывает большую часть оттока, которую вы должны реализовать для любого приличного многопоточного приложения.

Задачи не вводят никаких новых функциональных возможностей, которые вы не могли реализовать самостоятельно, per se (что ядром ваших вопросов, я считаю). Они могут быть синхронными или асинхронными - если они асинхронны, они либо используют внутренний класс Thread, либо IOCP.

Некоторые из вопросов, освещаемых TPL являются:

  • Rethrow исключения из дочернего потока на вызывающем потоке.
  • Асинхронный код (запуск нить -> выполнить произвольный код во время ожидания для дочернего потока -> резюме, когда ребенок нить более) выглядит, как если бы это были синхронными, что значительно улучшает читаемость и ремонтопригодность
  • Simpler нити дезактивации (с использованием CancellationTokenSource)
  • Параллельные запросы/обработки данных с использованием PLINQ или Parallel класса
  • Асинхронный рабочие процессы с использованием TPL DataFlow
+1

Большое спасибо за ответ и решение основной проблемы. По-моему, я не был достаточно ясен в своем вопросе. Таким образом, нет никакой разницы в отношении параллелизма в отношении TPL и классической нити. Поскольку оба будут внутренне использовать временную разбивку или несколько ядер на основе ОС, не так ли? – CriketerOnSO

+0

@CriketerOnSO Правильно :) TPL - это набор библиотек, частично созданный поверх существующего класса 'Thread'. – dcastro

+0

еще раз спасибо, Принял ваш ответ – CriketerOnSO

16

При создании thread он образует вид логической группы работы. .NET Framework будет использовать CPU-Time из системы. Скорее всего, несколько потоков будут выполняться на разных ядрах (это то, что система рулит - даже .NET не влияет на это)

Но может случиться так, что система выполнит все ваши потоки на одном и том же ядре или даже перемещает выполнение между несколькими ядрами во время выполнение. Держите в виду, что вы упаковываете Темы, и не настоящие системные нитки.

(Правильно говорят, я должен сказать:. Система может выполнять ваши удалось нити в пределах одной и той же System-Thread или использовать несколько System-Threads для нескольких управляемых потоков)

Может быть, вы хотите посмотрите этот блог-пост: http://www.drdobbs.com/parallel/managed-threads-are-different-from-windo/228800359 Объяснение там довольно хорошее с точки зрения деталей.

+2

Благодарим вас за ответы, если потоки будут выполняться или будут выполняться на нескольких ядрах, а что же такого особенного в Параллелизме задач? – CriketerOnSO

+0

Возможно, это было немного плохой формулировкой: он не будет работать на нескольких ядрах одновременно. Но он может быть перенесен с «ядра на ядро», как система решает это сделать. (Он также может быть временно приостановлен, чтобы приоритезировать другие темы и т. Д.) – dognose

9

Неплохой первый вопрос. +1

Я предлагаю вам прочитать Threading in C# by Joseph Albahari. Если вы читаете по почте вы найдете:

Как многопоточности Работы

Многопоточность управляется внутренне поточно планировщик, функции CLR обычно делегирует операционную систему. Планировщик потоков обеспечивает выделение всех активных потоков времени выполнения и тех потоков, которые ждут или заблокированы (для экземпляра , при исключительной блокировке или при вводе пользователя) не потребляют CPU времени.

Таким образом, многопоточность обрабатывается операционной системой через планировщик потоков.

Далее пост имеет:

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

+1

Спасибо за ответ. – CriketerOnSO

+2

Ваше замечание «Не плохой первый вопрос. +1», вероятно, следует переместить в комментарий по этому вопросу, так как оно не будет релевантным или полезным для других пользователей, которые найдут этот вопрос. – Spooky

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