2011-01-11 3 views
0

Я пытаюсь выяснить, как лучше всего использовать четырехъядерный компьютер с использованием фоновых работников. В частности, нужно ли указывать для запуска на нескольких ядрах или же CRL автоматически делегирует потоки в разных ядрах? Кроме того, возможно ли запускать несколько экземпляров BGW (я один, который уже запускает бесконечный цикл и передает объекты обратно в основной поток, но я бы предпочел использовать и другие ядра).Многопоточность/BackgroundWorkers с Quad-Cores (C#)

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

Любые мысли были бы высоко оценены!

Приветствие

ответ

1

Нить планировщик для Windows распределяет готовую к запуску темы между ядрами. Он полностью автоматический.

3

Для параллелирования циклов Parallel.For или Parallel.Invoke (в зависимости от того, что вы хотите) возможности .NET 4.0 можно использовать очень эффективно, и по моему опыту Parallel.Invoke - это самый быстрый способ (даже быстрее, чем вручную создавать потоки рабочего потока).

1

Библиотека времени выполнения «пойдет правильно» (в основном). Он определяет, сколько ядер у вас есть, и соответственно пытается сбалансировать рабочую нагрузку.

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

Несмотря на то, что в документации рекомендуется использовать BackgroundWorker для выполнения коротких задач, она может работать в таком приложении, если у вас нет целого ряда из них (то есть вы исчерпываете пул потоков). Если вам нужны некоторые длинные потоки, а также нужно много использовать пул потоков, то вам, вероятно, стоит подумать о создании собственных потоков без пула (с использованием класса System.Threading.Thread) для долговременных задач.