Структуры данных для параллельного программирования
Статья
Платформа .NET предоставляет несколько типов для параллельного программирования, включая набор классов параллельных коллекций, упрощенные примитивы синхронизации и типы отложенной инициализации. Эти типы можно использовать с любым кодом многопоточного приложения, включая библиотеку параллельных задач и PLINQ.
Классы параллельных коллекций
Классы коллекций в пространства имен System.Collections.Concurrent поддерживают потокобезопасные операции добавления и удаления, которые избегают блокировок везде, где это возможно, и применяют только детально настроенные блокировки. Класс параллельных коллекций не требует использовать блокировки в пользовательском коде для доступа к элементам. Классы параллельных коллекций могут значительно повысить производительность по сравнению с типами System.Collections.ArrayList и System.Collections.Generic.List<T> (где блокировка реализуется пользователем) в сценариях одновременного добавления и удаления элементов коллекции из нескольких потоков.
В приведенной ниже таблице перечислены классы параллельных коллекций.
Предоставляет возможности блокировки и ограничения для потокобезопасных коллекций, реализующих System.Collections.Concurrent.IProducerConsumerCollection<T>. Потоки-производителя блокируются, если нет доступных слотов или коллекция заполнена. Потоки-потребители блокируются, если коллекция пуста. Этот тип также поддерживает неблокирующий доступ для потребителей и производителей. BlockingCollection<T> можно использовать в качестве базового класса или резервного хранилища с поддержкой блокировок и ограничений для любого класса коллекции с поддержкой IEnumerable<T>.
Примитивы синхронизации в пространстве имен System.Threading обеспечивают детально настраиваемый параллелизм и более высокую производительность за счет устранения ресурсоемких механизмов блокировки из старого кода для многопоточной работы.
В приведенной ниже таблице перечислены типы синхронизации.
Позволяет нескольким потокам работать над выполнением алгоритма параллельно, поддерживая точку регистрации, в которой каждая задача отмечает свою доступность и ожидает новых задач. Дополнительные сведения см. в разделе Барьер.
Упрощает сценарии ветвления и соединения, предоставляя удобный механизм взаимодействия. Более подробную информацию можно найти в описании события CountdownEvent.
Примитив синхронизации, который ограничивает количество потоков, одновременно обращающихся к ресурсу или пулу ресурсов. Дополнительные сведения см. в описании классов Semaphore и SemaphoreSlim.
Примитив взаимоисключающей блокировки, при использовании которого поток, который пытается получить блокировку, применяет цикл ожидания в течение заданного времени, прежде чем получить свою часть времени. В сценариях, где прогнозируется короткий период ожидания блокировки, SpinLock обеспечит более высокую производительность по сравнению с другими формами блокировки. Дополнительные сведения см. в описании SpinLock.
Небольшой и нетребовательный к ресурсам тип, который реализует небольшую паузу, и только по истечении заданного времени переходит в состояние ожидания. Дополнительные сведения см. в описании SpinWait.
При использовании отложенной инициализации память выделяется объекту только в тот момент, когда она нужна. Отложенная инициализация позволяет повысить производительность, равномерно распределяя процессы выделения объектов на вест период существования программы. Чтобы включить отложенную инициализацию для любого пользовательского типа, упакуйте в него тип Lazy<T>.
В следующей таблице перечислены типы отложенной инициализации.
Предоставляет статические методы, которые избавляют от необходимости выделять экземпляр отложенной инициализации. Вместо этого он использует ссылки, гарантирующие инициализацию целевых объектов при первом обращении к ним.
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Отзыв о .NET
.NET — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Присоединитесь к серии встреч для создания масштабируемых решений искусственного интеллекта на основе реальных вариантов использования с другими разработчиками и экспертами.
В этом модуле рассматривается использование исключений и процесса обработки исключений в консольных приложениях C#. Практические действия обеспечивают реализацию шаблонов обработки исключений для различных сценариев программирования.
Вы можете изучить библиотеку параллельных задач (TPL) — набор общедоступных типов и интерфейсов API, упрощающий процесс добавления параллелизма в приложения .NET.
Сведения о том, как библиотека параллельных задач (TPL) поддерживает параллелизм данных для одновременного выполнения одной и той же операции для элементов в исходной коллекции или массиве в .NET.