Подтвердить что ты не робот

Выполняются ли потоки на нескольких процессорах?

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

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

4b9b3361

Ответ 1

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

-if потоки будут/могут выполняться на нескольких ядрах, а что тогда особенного в Task Parallelism?

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

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

Некоторые из вопросов, адресованных TPL:

  • Исключить исключения из дочернего потока в вызывающем потоке.
  • Асинхронный код (запуск потока → запуск произвольного кода при ожидании дочернего потока → возобновление, когда дочерний поток завершен) выглядит так, как если бы он был синхронным, что значительно улучшало читаемость и ремонтопригодность
  • Упрощение отмены нити (используя CancellationTokenSource)
  • Параллельные запросы/обработка данных с использованием PLINQ или Parallel класс
  • Асинхронные рабочие процессы с использованием потока данных TPL

Ответ 2

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

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

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

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

Ответ 3

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

Я бы предложил вам прочитать Threading in С# by Joseph Albahari. Если вы прочитаете сообщение, вы найдете:

Как работает Threading

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

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

Далее сообщение имеет:

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