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

У меня есть несколько библиотек классов C #, которые были разработаны без учета таких вещей, как параллелизм, множественные потоки, блокировки и т. Д ...

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

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

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

Ответы [ 4 ]

9 голосов
/ 10 марта 2010

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

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

Возможно, что использование .NET 4.0 Task Parallel Library упростит работу, но не позволит полностью устранить разрыв между кодом, который не был разработан, чтобы быть параллельным, и кодом, который есть. 1007 *

5 голосов
/ 10 марта 2010

Я бы настоятельно рекомендовал изучить .NET 4 и параллельную библиотеку задач (также доступную в .NET 3.5sp1 через Rx Framework).

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

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

2 голосов
/ 10 марта 2010

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

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

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

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

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

0 голосов
/ 10 марта 2010

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

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...