Многопоточность / BackgroundWorkers с четырьмя ядрами (C #) - PullRequest
0 голосов
/ 11 января 2011

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

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

Любые мысли приветствуются!

Приветствия

Ответы [ 3 ]

3 голосов
/ 11 января 2011

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

1 голос
/ 11 января 2011

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

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

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

1 голос
/ 11 января 2011

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

...