Параллельное программирование на C# и .NET Core
Покупка
Новинка
Издательство:
ДМК Пресс
Автор:
Танвар Шакти
Перевод:
Воронина А. Д.
Редактор:
Черников Вячеслав Николаевич
Год издания: 2022
Кол-во страниц: 272
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
Профессиональное образование
ISBN: 978-5-97060-851-7
Артикул: 833973.01.99
Книга представляет подход к параллельному программированию с учетом современных реалий. Информация структурирована таким образом, чтобы она легко усваивалась, даже если читатель не обладает специальными знаниями. Рассматриваются общие принципы написания параллельного и асинхронного кода; реализация параллелизма данных показана на коротких и простых примерах. В конце глав приводятся вопросы для повторения пройденного. Издание предназначено для программистов C#, которые хотят изучить концепции параллельного программирования и многопоточности, а затем использовать полученные знания для приложений, построенных на базе .NET Core. Также оно пригодится специалистам, желающим ознакомиться с принципами работы параллельного программирования на современном оборудовании.
- Полная коллекция по информатике и вычислительной технике
- ДМК Пресс. Информационные системы и технологии
- ДМК Пресс. ИТ-технологии для профессионалов
- Интермедиатор. Информационные системы и технологии (сводная)
- Интермедиатор. ИТ-технологии для профессионалов (сводная)
- Программирование и алгоритмизация
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Шакти Танвар Параллельное программирование на C# и .NET Core
Hands-On Parallel Programming with C# and .NET Core Build solid enterprise software using task parallelism and multithreading Shakti Tanwar BIRMINGHAM – MUMBAI
Параллельное программирование на C# и .NET Core Создание надежного корпоративного программного обеспечения с использованием параллелизма и многопоточности Шакти Танвар Москва, 2022
УДК 004.438.NET ББК 32.973.26-018.2 Т18 Танвар Ш. Т18 Параллельное программирование на C# и .NET Core / пер. с англ. А. Д. Во рониной; ред. В. Н. Черников. – М.: ДМК Пресс, 2022. – 272 с.: ил. ISBN 978-5-97060-851-7 Книга представляет подход к параллельному программированию с учетом современных реалий. Информация структурирована таким образом, чтобы она легко усваивалась, даже если читатель не обладает специальными знаниями. Рассматриваются общие принципы написания параллельного и асинхронного кода; реализация параллелизма данных показана на коротких и простых примерах. В конце глав приводятся вопросы для повторения пройденного. Издание предназначено для программистов C#, которые хотят изучить концепции параллельного программирования и многопоточности, а затем использовать полученные знания для приложений, построенных на базе .NET Core. Также оно пригодится специалистам, желающим ознакомиться с принципами работы параллельного программирования на современном оборудовании. УДК 004.438.NET ББК 32.973.26-018.2 First published in the English language under the title ‘Hands-On Parallel Programming with C# 8 and .NET Core 3 – (9781789132410)’. Russian language edition copyright © 2021 by DMK Press. All rights reserved. Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. ISBN 978-1-78913-241-0 (англ.) © Packt Publishing, 2019 ISBN 978-5-97060-851-7 (рус.) © Перевод, оформление, издание, ДМК Пресс, 2022
Посвящается моим жене и сыну, Кирти Танвар и Шашвату Сингх Танвар. Они мой жизненно необходимый кислород и стимул, вдохновляющий меня на достижение выдающихся успехов
Содержание От издательства ......................................................................................................14 Об авторе ..................................................................................................................15 О переводе ...............................................................................................................16 О рецензентах .........................................................................................................17 Предисловие ............................................................................................................18 Часть I. ТЕОРЕТИЧЕСКИЕ ОСНОВЫ РАБОТЫ С ПОТОКАМИ, МНОГОЗАДАЧНОСТИ И АСИНХРОННОСТИ ........................................22 Глава 1. Введение в параллельное программирование ..........................23 Технические требования ...........................................................................................24 Подготовка к многоядерным вычислениям ..........................................................24 Процессы .................................................................................................................24 Дополнительно об ОС .......................................................................................24 Многозадачность ...................................................................................................25 Hyper-threading ......................................................................................................25 Классификация Флинна ....................................................................................26 Потоки .....................................................................................................................27 Типы потоков .....................................................................................................27 Многопоточность ...................................................................................................30 Класс Thread .......................................................................................................31 Класс ThreadPool ................................................................................................35 BackgroundWorker ..............................................................................................38 Многопоточность и многозадачность ................................................................41 Сценарии, при которых полезно параллельное программирование ................42 Преимущества и недостатки параллельного программирования .....................42 Резюме .........................................................................................................................43 Вопросы .......................................................................................................................44 Глава 2. Параллелизм задач ...............................................................................45 Технические требования ...........................................................................................45 Задачи ..........................................................................................................................46 Создание и запуск задачи .........................................................................................46 Класс System.Threading.Tasks.Task ......................................................................47 Синтаксис лямбда-выражений ........................................................................47 Делегат Action ....................................................................................................47 Делегат ................................................................................................................47
Содержание 7 Метод System.Threading.Tasks.Task.Factory.StartNew .......................................48 Синтаксис лямбда-выражений ........................................................................48 Делегат Action ....................................................................................................48 Делегат ................................................................................................................48 Метод System.Threading.Tasks.Task.Run .............................................................49 Синтаксис лямбда-выражений ........................................................................49 Делегат Action ....................................................................................................49 Делегат ................................................................................................................49 Метод System.Threading.Tasks.Task.Delay ...........................................................49 Метод System.Threading.Tasks.Task.Yield ............................................................50 Метод System.Threading.Tasks.Task.FromResult<T> ..........................................52 Методы System.Threading.Tasks.Task.FromException и System.Threading.Tasks.Task.FromException<T> .............................................53 Методы System.Threading.Tasks.Task.FromCanceled и System.Threading.Tasks.Task.FromCanceled<T> ..............................................53 Результаты выполнения задач .................................................................................54 Отмена задач ..............................................................................................................55 Создание метки ......................................................................................................55 Создание задач с использованием меток ..........................................................56 Опрос состояния метки через свойство IsCancellationRequested ..............56 Регистрация отмены запроса с по мощью делегата обратного вызова .....57 Ожидание выполнения задач...................................................................................58 Task.Wait ..................................................................................................................59 Task.WaitAll .............................................................................................................59 Task.WaitAny ...........................................................................................................60 Task.WhenAll ...........................................................................................................60 Task.WhenAny .........................................................................................................61 Обработка исключений в задачах ...........................................................................61 Обработка исключений из одиночных задач ....................................................62 Обработка исключений из нескольких задач ....................................................62 Обработка исключений задач с помощью обратного вызова ........................63 Преобразование шаблонов APM в задачи ..............................................................64 Преобразование EAP в задачи .................................................................................66 И еще о задачах ..........................................................................................................67 Цепочки задач ........................................................................................................67 Продолжение выполнения задач с по мощью метода Task.ContinueWith..............................................................................................68 Продолжение выполнения задач с по мощью Task.Factory.ContinueWhenAll и Task.Factory.ContinueWhenAll<T> ...........69 Продолжение выполнения задач с по мощью Task.Factory.ContinueWhenAny и Task.Factory.ContinueWhenAny<T> .......69 Родительские и дочерние задачи ........................................................................70 Создание отсоединенной задачи ........................................................................70 Создание присоединенной задачи .....................................................................71 Очереди с перехватом работы .................................................................................72 Резюме .........................................................................................................................74
Содержание Глава 3. Реализация параллелизма данных .................................................75 Технические требования ...........................................................................................75 От последовательных циклов к параллельным .....................................................75 Метод Parallel.Invoke .............................................................................................76 Метод Parallel.For ...................................................................................................78 Метод Parallel.ForEach ...........................................................................................79 Степень параллелизма ..............................................................................................80 Создание своей стратегии разделения данных .....................................................82 Разделение данных по диапазону .......................................................................83 Разделение данных по блокам.............................................................................83 Отмена циклов ...........................................................................................................84 Использование метода Parallel.Break .................................................................85 Использование ParallelLoopState.Stop ................................................................86 Использование CancellationToken для отмены циклов ....................................87 Хранение данных в параллельных циклах ............................................................88 Локальная переменная потока ............................................................................89 Локальная переменная блока данных ................................................................90 Резюме .........................................................................................................................91 Вопросы .......................................................................................................................91 Глава 4. Использование PLINQ ..........................................................................93 Технические требования ...........................................................................................93 LINQ-провайдеры в .NET ..........................................................................................93 Создание PLINQ-запросов ........................................................................................94 Знакомство с классом ParallelEnumerable ..........................................................94 Наш первый запрос PLINQ ...................................................................................95 Сохранение порядка в PLINQ при параллельном исполнении...........................96 Последовательное выполнение с использованием метода AsUnOrdered() .....97 Параметры объединения данных в PLINQ .............................................................98 Параметр NotBuffered ...........................................................................................98 Параметр AutoBuffered..........................................................................................99 Параметр FullyBuffered .......................................................................................100 Отправка и обработка исключений с помощью PLINQ .....................................102 Объединение параллельных и последовательных запросов LINQ ...................104 Отмена запросов PLINQ ..........................................................................................104 Недостатки параллельного программирования с по мощью PLINQ ................106 Факторы, влияющие на производительность PLINQ (ускорения) ....................106 Степень параллелизма ........................................................................................107 Настройка объединения данных .......................................................................107 Тип разделения данных ......................................................................................107 Когда нужно сохранять последовательное исполнение в PLINQ? ................107 Порядок работы ...................................................................................................108 ForAll против вызова ToArray() или ToList() ....................................................108 Принудительный параллелизм .........................................................................108 Генерация последовательностей .......................................................................108 Резюме .......................................................................................................................109 Вопросы .....................................................................................................................110
Содержание 9 Часть II. СТРУКТУРЫ ДАННЫХ .NET CORE, КОТОРЫЕ ПОДДЕРЖИВАЮТ ПАРАЛЛЕЛИЗМ ..................................111 Глава 5. Примитивы синхронизации .............................................................112 Технические требования .........................................................................................112 Что такое примитивы синхронизации? ...............................................................113 Операции со взаимоблокировкой .........................................................................113 Барьеры доступа к памяти в .NET .....................................................................115 Что такое изменение порядка? ..........................................................................115 Типы барьеров памяти ........................................................................................116 Как избежать изменения порядка .....................................................................117 Введение в примитивы блокировки .....................................................................118 Как работает блокировка ....................................................................................118 Состояния потока ................................................................................................118 Блокировка или вращение? ...............................................................................119 Блокировка, мьютекс и семафор .......................................................................120 Lock ....................................................................................................................120 Mutex .................................................................................................................123 Semaphore .........................................................................................................124 ReaderWriterLock ..................................................................................................126 Введение в сигнальные примитивы .....................................................................126 Thread.Join .............................................................................................................126 EventWaitHandle ...................................................................................................128 AutoResetEvent .................................................................................................128 ManualResetEvent .............................................................................................129 WaitHandles ...........................................................................................................131 Легковесные примитивы синхронизации ...........................................................134 Slim locks ...............................................................................................................134 ReaderWriterLockSlim ......................................................................................135 SemaphoreSlim ..................................................................................................136 ManualResetEventSlim .....................................................................................137 События Barrier и CountDownEvent .......................................................................137 Примеры использования Barrier и CountdownEvent ......................................138 SpinWait .....................................................................................................................140 SpinLock .................................................................................................................141 Резюме .......................................................................................................................142 Вопросы .....................................................................................................................142 Глава 6. Использование параллельных коллекций .................................144 Технические требования .........................................................................................144 Введение в параллельные коллекции ...................................................................144 Знакомство с IProducerConsumerCollection<T> ...............................................145 Использование ConcurrentQueue <T> ...........................................................145 Производительность Queue<T> в сравнении с ConcurrentQueue<T> ......148 Использование ConcurrentStack <T> .............................................................148 Создание параллельного стека ......................................................................149
Содержание Использование ConcurrentBag<T> ................................................................150 Использование BlockingCollection<T> ..............................................................151 Создание BlockingCollection<T> ....................................................................151 Сценарий с несколькими производителями и потребителями ........................153 Использование ConcurrentDictionary<TKey,TValue> .......................................154 Резюме .......................................................................................................................155 Вопросы .....................................................................................................................156 Глава 7. Повышение производительности с по мощью отложенной инициализации ............................................................................157 Технические требования .........................................................................................157 Что такое отложенная инициализация? ...............................................................157 Введение в System.Lazy<T> .....................................................................................160 Логика создания объекта реализуется в конструкторе ..................................161 Логика создания объекта передается в качестве делегата в Lazy<T> ..........162 Обработка исключений с по мощью шаблона отложенной инициализации ....163 Отсутствие исключений в ходе инициализации ............................................163 Случайное исключение при инициализации с кешированием исключений ..........................................................................................................163 Некешируемые исключения ..............................................................................165 Отложенная инициализация с локальным хранилищем потоков ...................166 Сокращение издержек при помощи отложенной инициализации ..................168 Резюме .......................................................................................................................170 Вопросы .....................................................................................................................170 Часть III. АСИНХРОННОЕ ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ С# .................................................................................172 Глава 8. Введение в асинхронное программирование ..........................173 Технические требования .........................................................................................174 Типы выполнения программ .................................................................................174 Синхронное выполнение программ .................................................................174 Асинхронное выполнение программ ...............................................................176 Случаи использования асинхронного программирования ...............................177 Написание асинхронного кода ..........................................................................177 Использование метода BeginInvoke класса Delegate ..................................178 Использование класса Task ............................................................................179 Использование интерфейса IAsyncResult ....................................................179 Когда не следует использовать асинхронное программирование ...................181 В базе данных без пула обработки подключений ...........................................181 Когда важно, чтобы код легко читался и поддерживался ..............................181 Для простых и быстрых операций ....................................................................181 Для приложений с большим количеством разделяемых данных ................182 Проблемы, решаемые асинхронным кодом ........................................................182 Резюме .......................................................................................................................183 Вопросы .....................................................................................................................183