DEV-C230. Параллельное программирование на С++ (Стандарт С++11, С++14, С++17, C++20)
Длительность дисциплины: 44 ак.ч.
Аннотация
Целью реализации модуля «DEV-C230. Параллельное программирование на С++ (Стандарт С++11, С++14, С++17, C++20)» является совершенствование и/или получение компетенций в области создания параллельных программ средствами языка программирования С++, а также приобретение практических навыков по применению новых средств при решении прикладных задач.
Знания и умения, полученные в результате изучения
В результате освоения программы обучающийся должен уметь:
• распараллеливать задачи средствами многопоточной составляющей стандартной библиотеки С++;
• задавать и измерять временные промежутки и моменты времени в любых единицах;
• получать результаты выполнения параллельно выполняющихся задач.
• синхронизировать потоки в рамках одного приложения;
• создавать многопоточное приложение без блокировок;
• использовать атомарные операции;
• использовать локальную память потока.
В результате освоения программы обучающийся должен знать:
• теоретические основы организации параллельных вычислений;
• принципы объектной модели операционной системы;
• средства С++ для манипулирования временными интервалами и моментами времени;
• средства С++ для запуска обособленных потоков и для ожидания завершения запущенных потоков;
• средства С++ для синхронизации потоков;
• концепции модели памяти С++;
• приемы программирования без блокировок.
В результате освоения программы обучающийся должен приобрести практический опыт:
• разработки системного ПО для ОС Windows на языке С++.
Содержание дисциплины
Тема 1. Введение в параллельное программирование
1.1 Парадигмы параллельного программирования
Цель распараллеливания программ.
Средства распараллеливания.
1.2 Проблемы параллельного программирования
Защита ресурсов от одновременного использования разными потоками.
Практические занятия
Не предусмотрены
Тема 2. Библиотека CHRONO
2.1 Моменты времени
Задание/получение моментов времени
2.2 Интервалы времени
Задание/получение интервалов времени
Практические занятия
1. Измерение времени выполнения фрагмента кода
Тема 3. Низкоуровневые средства запуска потоков
3.1 Запуск потока посредством объекта std::thread
Конструктор класса thread.
Специфика реализации потоковой функции.
Специфика формирования параметров, передаваемых потоковой функции
3.2 Ожидание завершения потока.
Запуск обособленных потоков Методы join() и detach().
Специфика использования
3.3 Пространство имен this_thread
Средства для получения информации о текущем потоке или для управления текущим потоком
Практические занятия
1. Реализация запуска зависимого потока
2. Реализация запуска обособленного потока
3. Исключение из диспетчирования текущего потока на указанный промежуток времени
Тема 4. Обработка межпоточных исключений
4.1 Проблемы обработки межпоточных исключений
Раскрутка стека при генерации исключения.
4.2 Средства для обработки межпоточных исключений
Класс std::exception_ptr.
Функции std::current_exception(),std::rethrow_exception()
Практические занятия
1. Пример генерации исключения в одном потоке, а обработки в другом
Тема 5. Синхронизация задач. Мьютексы. Семафоры.
5.1 Проблемы конкурентного программирования Гонка за данными.
Разделение ресурса между потоками
5.2 Классы поддержки мьютексов
Взаимоисключающая блокировка.
Классы: std::mutex, std::recursive_mutex, std::timed_mutex, std:: recursive_timed_mutex, std:: shared_timed_mutex.
Методы и глобальные функции для блокировки и освобождения мьютексов.
Классы-обертки для мьютексов.
5.3 Классы поддержки семафоров
Классы std::counting_semaphore, std::binary_semaphore
Практические занятия
1. Разработка потокобезопасного стека
Тема 6. Высокоуровневые средства запуска и взаимодействия потоков
6.1 Синхронный и асинхронный запуск потоков.
Функция async().
Передача параметров.
Синхронное и асинхронное использование.
6.2 Обработка результата выполнения потока.
Обработка исключений, сгенерированных потоком
Получение результата – классs std::future и std::shared_future, класс promise.
Обработка межпоточных исключений посредством future и promise. Шаблон класса std::packaged_task
Практические занятия
1. Реализация пула потоков
2. Реализация шаблона проектирования «Singleton»
Тема 7. Синхронизация задач. Условные переменные
7.1 Условные переменные
Классы std::condition_variable
std::condition_variable_any.
Специфика.
Варианты использования.
Практические занятия
1. Реализация потокобезопасной очереди посредством условных переменных
Тема 8. Модель памяти С++ 11
8.1 Проблемы конкурентного программирования. Понятие модели памяти С++11
Формирование правил упорядочения обращения к данных в многопоточном приложении.
Понятие memory location.
8.2 Средства для управления моделью памяти
Проблемы обращения к разделяемым данным.
Атомарные типы данных.
Атомарные операции.
Шаблон шаблона std::atomic<T>
Практические занятия
1. Пример использования атомарных типов данных и атомарных операций.
Тема 9. Программирование без блокировок
9.1 Порядок исполнения
Проблемы порядка исполнения многопоточного приложения.
Отношения – «sequenced before/ sequenced after».
Группировка неатомарных операций вокруг атомарных.
9.2 Барьеры
Способ принудительного упорядочения выполнения кода.
Запрет переупорядочения операций компилятору или процессору.
9.3 Средства принудительного упорядочения кода
Использование именованной константы из перечисления std::memory_order в качестве параметра атомарной операции
9.4 Виды принудительного упорядочения
Последовательно согласованное упорядочение (глобальное).
Упорядочение захват/освобождение (между парами потоков).
Ослабленное упорядочение
Практические занятия
1. Реализация многопоточного стека без блокировок
Тема 10. Локальная память потока (TLS)
10.1 Проблемы разделения данных потоками
Проблемы разделения данных потоками
10.2 Спецификатор класса хранения thread_local
Спецификатор класса хранения thread_local
Практические занятия
1. Пример использования спецификатора класса хранения thread_local
Тема 11. Сопрограммы(coroutines)
11.1 Классификация сопрограмм, реализация, допущения и соглашения по использованию
Операторы co_await, co_yield, co_return
Практические занятия
1. Пример использования сопрограмм
Тема 12. Промежуточная аттестация
Практические занятия Зачет