Основные вопросы многопоточности в C # - PullRequest
3 голосов
/ 04 ноября 2010

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

[1] В .NET 3.5 это ThreadPool единственный способпрограмма для эксплуатации многоядерных процессоров в машине?т.е. возможно ли порождать потоки на разных ядрах, используя new Thread()?

[2] Мой случай: у меня есть List<Calculation>, который содержит около 80 элементов, которые в настоящее время обрабатываются последовательно.Поэтому, учитывая, что я использую .NET 3.5 и основываясь на том, что я прочитал, ThreadPool - это, вероятно, моя лучшая ставка для многопоточности из-за большого количества потоков:большая зависимость между расчетами.В настоящее время список упорядочен таким образом, что все необходимые вычисления выполняются в начале.

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

alt text

  • Время расчета сильно отличается, один объект вычисления может просто включать в себя получение значения, другие объекты вычисления могут потребовать многоработы во вложенных циклах ... и т. д.

Как назначить приоритеты основным Calculations, в которых есть что-то вроде 10+ других рабочих элементов, в зависимости от этого?Какой самый эффективный способ сигнализации использовать?

Спасибо.

Редактировать: я должен отметить, что List<Calculation> остается фиксированным.Тем не менее, вычисление 80+ расчетов называется х миллионов раз.Каждый раз, когда обновляется итератор, Calculate () вызывается для каждого Calculation в списке.

Ответы [ 4 ]

2 голосов
/ 04 ноября 2010

Это было бы НАМНОГО ЛЕГКО в .Net 4.0 при использовании Task Parallel Library .

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

Если вам действительно нужно выполнить эту грубую силу, вы можете использовать Thread.BeginThreadAffinity , чтобы обеспечить выполнение закрытого кода наодин процессор.Это должно помочь вашему расчету производительности.

2 голосов
/ 04 ноября 2010

[1]: Да, можно порождать потоки на разных ядрах, используя new Thread(), хотя вам может быть лучше использовать пул потоков. Различия обсуждаются здесь:

Тема против ThreadPool

1 голос
/ 04 ноября 2010

[1] В .NET 3.5 является ли ThreadPool единственным способом для программы использовать многоядерные процессоры на компьютере?т.е. можно ли порождать потоки на разных ядрах с помощью нового Thread ()?

Решение о том, на каком ядре должен выполняться поток, зависит от операционной системы.По умолчанию ОС будет равномерно распределять потоки по нескольким ядрам (по крайней мере, в Windows).

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

[2] Мой случай: у меня Listthat содержит около 80 элементов, которые в настоящее время обрабатываются последовательно.Поэтому, учитывая, что я использую .NET 3.5 и основываясь на том, что я прочитал, ThreadPool, вероятно, является моей лучшей ставкой для многопоточности из-за большого количества потоков:

Использование ThreadPool.QueueWorkItemкажется, самый простой способ конвертировать ваше приложение.

Имейте в виду, что запуск 100 различных потоков не означает, что ваше приложение будет работать в 10 раз быстрее, чем 10 потоков.Более вероятно, что 10 потоков будут работать быстрее, если фоновые процессы происходят, когда .net и ОС переключаются между потоками.

  1. Я бы преобразовал List в Queue
  2. При запуске ваших вычислений добавьте 10 (или любое другое число) вызовов в ThreadPool.QueueWorkerItem (MyMethod);
  3. В MyMethod создайте цикл, который продолжает удалять объекты из очереди, пока не будетосталось еще рабочих мест.
0 голосов
/ 04 ноября 2010

Как уже упоминалось в комментариях, PLINQ делает это очень просто.

List<Calculation> foo = ...;
foo.AsParallel.Select(c => c.Calculate());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...