Скачать презентацию Параллельное программирование в NET Архитектура параллельного программирование Скачать презентацию Параллельное программирование в NET Архитектура параллельного программирование

параллельное_программирование_лекция9.pptx

  • Количество слайдов: 28

Параллельное программирование в. NET Параллельное программирование в. NET

Архитектура параллельного программирование в. NET Архитектура параллельного программирование в. NET

Основные структуры данных Основные структуры данных

Класс Thread • Класс Thread в System. Threading позволяет создавать и управлять потоками. • Класс 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() Класс Thread ² ² ² Метод Print() печатает символ 1 на консоль. Метод Main() создает и запускает поток, который выполняет метод Print() Метод Main() далее выполняет цикл, в котором печатает 2 на консоль. Таким образом в программе создаются два цикла, которые приводят к такому результату: Output

Пул потоков - Thread. Pool u u u u System. Threading содержит класс Thread. Пул потоков - 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

Синхронизация потоков • Почему использование lock(this) – моветон? • Почему не рекомендуется использовать строки? Синхронизация потоков • Почему использование lock(this) – моветон? • Почему не рекомендуется использовать строки?

События Auto. Reset. Event – – Manual. Reset. Event Когда событие находится в состояние События Auto. Reset. Event – – Manual. Reset. Event Когда событие находится в состояние НЕАКТИВНО, потоки могут ожидать, пока событие перейдет в состояние АКТИВНО. Класс Auto. Reset. Event в System. Threading представляет объект события, который автоматически переходит в состояние НЕАКТИВНО после того как первый ожидающий поток продолжит свою работу. Класс Auto. Reset. Event предоставляет метод Wait. One() который может использоваться потоком для ожидания перехода события в состояние АКТИВНО. Метод Set() класса Auto. Reset. Event меняет состояние события с НЕАКТИВНО на АКТИВНО.

TPL TPL

TPL • Task Parallel Library – библиотека, предоставляющая API для параллельного программирования. TPL • Task Parallel Library – библиотека, предоставляющая API для параллельного программирования.

TPL. Класс Task • TPL предоставляет класс Task в System. Threading. Tasks который представляет 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. Получение результата Часто требуется получение результата выполнения задачи. Можно использовать класс TPL. Класс Task. Получение результата Часто требуется получение результата выполнения задачи. Можно использовать класс Task который наследован от класса Task. В классе Task, T – тип возвращаемых данных. Для получения результата можно обратиться к свойству Result объекта типа Task. • Обращение к Result блокирует вызывающий поток до окончания выполнения задачи. • •

TPL. Зависимые задачи • При выполнении множества задач бывают ситуации когда одна задача должна TPL. Зависимые задачи • При выполнении множества задач бывают ситуации когда одна задача должна начаться сразу после окончания другой. • Такая последовательность выполнения обеспечивается вызовом метода Continue. With(). • Самая простая форма метода Continue. With() принимает объект класса Task, который начнет выполняться сразу после окончания текущей задачи. • Метод Continue. With() возвращает ссылку на новую задачу. Можно использовать метод Wait() для ожидания выполнения второй задачи. public static void Main() { // Execute the antecedent. Task task. A = Task. Run( () => Date. Time. Today. Day. Of. Week ); // Execute the continuation when the antecedent finishes. Task continuation = task. A. Continue. With( antecedent => Console. Write. Line("Today is {0}. ", antecedent. Result) ); }

TPL. Завершение задач • Cancellation. Token. Source — создаёт маркёры отмены (свойство Token) и 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. Source

TPL. Завершение задач. Cancellation. Token TPL. Завершение задач. Cancellation. Token

TPL. Завершение задач с продолжением TPL. Завершение задач с продолжением

TPL. Параллельные циклы u u u TPL предоставляет класс Parallel в System. Threading. Tasks 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( 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 циклы: • Итерации выполняются последовательно • Цикл выполняется одним TPL. Параллельные циклы • Foreach циклы: • Итерации выполняются последовательно • Цикл выполняется одним потоком • Выполнение более медленное (если одна итерация быстрая) • Parallel. For. Each: • Итерации выполняются параллельно. • Parallel. For. Each использует множество Threads. • Выполнение более быстрое (если одна операция медленна)

PLINQ PLINQ

LINQ • LINQ (Language-Integrated Query) – встроенный язык запросов. • Каждая операция состоит из: LINQ • LINQ (Language-Integrated Query) – встроенный язык запросов. • Каждая операция состоит из: • Получение источника данных. • Создание запроса. • Выполнение запроса.

LINQ расширения LINQ расширения

LINQ to Objects • LINQ to Objects - набор дополнительных методов для любых классов, LINQ to Objects • LINQ to Objects - набор дополнительных методов для любых классов, совместимых с интерфейсом IEnumerable. • IEnumerable — интерфейс для работы с элементами классов контейнеров, таких как: • • типизированные коллекции Collection списки List уникальные списки Hash. Set словари Dictionary и т. д.

PLINQ • • PLINQ – параллельная реализация LINQ to Object – работает с данными 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 PLINQ For. All • https: //msdn. microsoft. com/en-us/library/dd 997425(v=vs. 110). aspx

 • https: //habrahabr. ru/post/168669/ • https: //habrahabr. ru/post/168669/