Лучшие практики для превращения библиотеки классов.NET в многопоточную библиотеку классов.NET

У меня есть некоторые библиотеки классов C#, которые были разработаны, не принимая во внимание вещи как параллелизм, несколько потоков, блокировок, и т.д...

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

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

Я мог использовать любую доступную справку и любые рекомендации/предложения.

5
задан ileon 10 March 2010 в 02:04
поделиться

4 ответа

Я настоятельно рекомендую изучить .NET 4 и Task Parallel Library (также доступно в .NET 3.5sp1 через Rx Фреймворк).

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

Для некоторых справочных материалов, особенно по параллелизму данных и основам декомпозиции и решения проблемы, вам может потребоваться прочитать серию моих блогов по Параллелизм в .NET 4 .

5
ответ дан 18 December 2019 в 10:44
поделиться

Я бы рекомендовал не делать этого. Вы не писали этот код для параллельного использования, поэтому он не сработает и выйдет из строя, что будет трудно отладить.

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

Возможно, использование параллельной библиотеки задач .NET 4.0 упростит работу, но это не поможет полностью преодолеть разрыв между кодом, который не был разработан для параллельного выполнения, и кодом, который таковым является.

9
ответ дан 18 December 2019 в 10:44
поделиться

Если у вас нет опыта работы с многопоточностью, я бы порекомендовал вам сначала ознакомиться с основами, просмотрев различные ресурсы: https://stackoverflow.com/questions/540242/book-or-resource-on-c-concurrency

Чтобы сделать всю вашу библиотеку многопоточной, требуется совершенно новый архитектурный подход. Если вы просто начнете устанавливать блокировки повсюду в своем коде, вы в конечном итоге сделаете свой код очень громоздким и, возможно, даже не добьетесь увеличения производительности.

Лучшее параллельное программное обеспечение - без блокировок и без ожидания ... этого трудно добиться в C # (.NET), поскольку большинство ваших Коллекций не являются свободными от блокировок, без ожидания или даже поточно-ориентированными. Существуют различные дискуссии о структурах данных без блокировки . Многие люди ссылались на статьи Бойе (которые ДЕЙСТВИТЕЛЬНО хороши), и некоторые люди используют параллельную библиотеку задач в качестве следующего элемента параллелизма .NET, но TPL действительно не дает вам многого в условия поточно-ориентированных коллекций.

.NET 4.0 выходит с Collections.Concurrent , что должно очень помочь.

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

2
ответ дан 18 December 2019 в 10:44
поделиться

Вероятно, лучше всего начать с http://msdn.microsoft.com/en-us/concurrency/default.aspx

Удачи!

0
ответ дан 18 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: