параллельное_программирование_лекция9.pptx
- Количество слайдов: 28
Параллельное программирование в. NET
Архитектура параллельного программирование в. NET
Основные структуры данных
Класс Thread • Класс Thread в System. Threading позволяет создавать и управлять потоками. • Каждый поток находится в одном из состояний, определяемых перечислением Thread. State. • Для запуска потоку должен быть передан делегат Thread. Start в конструкторе класса Thread. • Thread. Start представляет собой метод, который выполняется в потоке. • После создания, поток может быть запущен методом Start() класса Thread. • Например: Snippet Service. Reference 1. Product. Service. Client client = new class Thread. Demo { public static void Print() { while (true) Console. Write("1"); } static void Main (string [] args) { Thread new. Thread = new Thread(new Thread. Start(Print)); new. Thread. Start(); while (true) Console. Write("2"); } }
Класс Thread ² ² ² Метод Print() печатает символ 1 на консоль. Метод Main() создает и запускает поток, который выполняет метод Print() Метод Main() далее выполняет цикл, в котором печатает 2 на консоль. Таким образом в программе создаются два цикла, которые приводят к такому результату: Output
Пул потоков - Thread. Pool u u u u System. Threading содержит класс Thread. Pool, который предназначен для прозрачного выполнения операций в потоках. Класс Thread. Pool представляет собой пул потоков, т. е. содержит в себе коллекцию потоков, готовых к выполнению. По требованию приложения пул выполняет указанную задачу в одном из своих потоков. Когда задача заканчивается она возвращается в пул потоков и может и использоваться повторно. Класс Thread. Pool содержит метод Queue. User. Work. Item() который вы можете использовать для выполнения своего кода в потоке. Метод принимает Wait. Callback делега, который принимает объект класса Object в качестве параметра Делегат Wait. Callback определяет метод, который должен быть выполнен в одном из потоков пула.
Синхронизация потоков • Самый простой способ синхронизации – структура lock
Синхронизация потоков • Почему использование lock(this) – моветон? • Почему не рекомендуется использовать строки?
События Auto. Reset. Event – – Manual. Reset. Event Когда событие находится в состояние НЕАКТИВНО, потоки могут ожидать, пока событие перейдет в состояние АКТИВНО. Класс Auto. Reset. Event в System. Threading представляет объект события, который автоматически переходит в состояние НЕАКТИВНО после того как первый ожидающий поток продолжит свою работу. Класс Auto. Reset. Event предоставляет метод Wait. One() который может использоваться потоком для ожидания перехода события в состояние АКТИВНО. Метод Set() класса Auto. Reset. Event меняет состояние события с НЕАКТИВНО на АКТИВНО.
TPL
TPL • Task Parallel Library – библиотека, предоставляющая API для параллельного программирования.
TPL. Класс Task • TPL предоставляет класс Task в System. Threading. Tasks который представляет собой асинхронную задачу. Можно использовать этот класс для выполнения методов асинхронно. • Для создания задачи нужно предоставить делегат, который будет выполняться асинхронно. Делегат может быть именованным делегатом, например Action, анонимным методом или лямбда функцией. После создания объекта Task, необходимо вызвать метод Start(). • Этот метод ставит задачу на выполнение в планировщик, который в дальнейшем назначит задаче один из потоков для ее выполнения. • Чтобы дождаться окончания выполнения задачи можно использовать метод Wait()объекта Task или статический метод Wait. All(). • Класс Task предоставляет метод Run() для создания и старта задачи в одной операции. • Например Snippet class Task. Demo { private static void print. Message() { Console. Write. Line("Executed by a Task"); } static void Main (string [] args) { Task task 1 = new Task(new Action(print. Message)); task 1. Start(); Task task 2 = Task. Run(() => print. Message()); task 1. Wait(); task 2. Wait(); Console. Write. Line("Exiting main method"); } }
TPL. Класс Task. Получение результата Часто требуется получение результата выполнения задачи. Можно использовать класс Task
TPL. Зависимые задачи • При выполнении множества задач бывают ситуации когда одна задача должна начаться сразу после окончания другой. • Такая последовательность выполнения обеспечивается вызовом метода Continue. With(). • Самая простая форма метода Continue. With() принимает объект класса Task, который начнет выполняться сразу после окончания текущей задачи. • Метод Continue. With() возвращает ссылку на новую задачу. Можно использовать метод Wait() для ожидания выполнения второй задачи. public static void Main() { // Execute the antecedent. Task
TPL. Завершение задач • Cancellation. Token. Source — создаёт маркёры отмены (свойство Token) и обрабатывает запросы на отмену операции (перегруженные методы Cancel/Cancel. After). • Cancellation. Token — маркёр отмены; позволяет несколькими способами отслеживать запросы на отмену операции: опросом свойства Is. Cancellation. Requested, регистрацией callback-функции (через перегруженный метод Register), ожиданием на объекте синхронизации (свойство Wait. Handle). • Operation. Canceled. Exception — исключение, выброс которого по соглашению означает, что запрос на отмену операции был обработан и операция должна считаться отменённой. Предпочтительный способ генерации исключения — вызов метода Cancellation. Token. Throw. If. Cancellation. Requested.
TPL. Завершение задач. Cancellation. Token. Source
TPL. Завершение задач. Cancellation. Token
TPL. Завершение задач с продолжением
TPL. Параллельные циклы u u u TPL предоставляет класс Parallel в System. Threading. Tasks который содержит методы для параллельного выполнения циклов, таких как for или foreach. Метод For() это статический метод класса Parallel который позволяет выполнять итерации цикла for параллельно. Так как итерации выполняются параллельно For(, последовательность выполнения каждый раз может отличаться. Метод For() имеет несколько перегруженных реализаций. Наиболее часто используемая реализация For() принимает три аргумента: ² ² ² int – начальный индекс элемента для обработки. int – конечный индекс элемента для обработки. Делегат System. Action
TPL. Параллельные циклы Snippet static void Main (string [] args) { Console. Write. Line("n. Using traditional for loop"); for (int i = 0; i <= 10; i++) { Console. Write. Line("i = {0} executed by thread with ID {1}", i, Thread. Current. Thread. Managed. Thread. Id); Thread. Sleep(100); } Console. Write. Line("n. Using Parallel For"); Parallel. For(0, 10, i => { Console. Write. Line("i = {0} executed by thread with ID {1}", i, Thread. Current. Thread. Managed. Thread. Id); Thread. Sleep(100); }); }
TPL. Параллельные циклы • Foreach циклы: • Итерации выполняются последовательно • Цикл выполняется одним потоком • Выполнение более медленное (если одна итерация быстрая) • Parallel. For. Each: • Итерации выполняются параллельно. • Parallel. For. Each использует множество Threads. • Выполнение более быстрое (если одна операция медленна)
PLINQ
LINQ • LINQ (Language-Integrated Query) – встроенный язык запросов. • Каждая операция состоит из: • Получение источника данных. • Создание запроса. • Выполнение запроса.
LINQ расширения
LINQ to Objects • LINQ to Objects - набор дополнительных методов для любых классов, совместимых с интерфейсом IEnumerable
PLINQ • • PLINQ – параллельная реализация LINQ to Object – работает с данными в одном потоке и последовательно, PLINQ выполняет операции параллельно. Количество потоков определяется количеством процессоров. Для параллельного доступа PLINQ делит входные данные на сегменты, которые обрабатывает в потоках. Класс Parallel. Enumerable в System. Linq предоставляет методы для использования PLINQ. Например: Snippet string[] arr = new string[] { "Peter“, "Sam", "Philip", "Andy"}; var query = from string name in arr select name; Console. Write. Line("Names retrieved using sequential LINQ"); foreach (var n in query) { Console. Write. Line(n); } var plinq. Query = from string name in arr. As. Parallel() select name; Console. Write. Line("Names retrieved using PLINQ"); foreach (var n in plinq. Query) { Console. Write. Line(n); }
PLINQ For. All • https: //msdn. microsoft. com/en-us/library/dd 997425(v=vs. 110). aspx
• https: //habrahabr. ru/post/168669/


