Магистратура
2025/2026




Многопоточное программирование на C++
Статус:
Курс обязательный (Аппаратно-программные комплексы искусственного интеллекта)
Кто читает:
Департамент электронной инженерии
Когда читается:
2-й курс, 2, 3 модуль
Охват аудитории:
для всех кампусов НИУ ВШЭ
Язык:
русский
Программа дисциплины
Аннотация
Данный курс является завершающим в цикле обучения C++ в рамках магистратуры и посвящен разработке высокопроизводительных приложений. На примере проекта - рендеринга на CPU - слушатели изучат способы разработки многопоточных программ в C++ для ОС Linux, пути решения проблем синхронизации (с блокировками и без), стандартные паттерны многопточного программирования. Итоговый проект данного курса будет объединять в себе знания, полученные на предыдущих дисциплинах, потребуется применение знаний об ассемблере, отладке и профайлировке программ, “широкие” инструкции и др.Курс является завершающим в наборе курсов, посвященных программированию на С/С++.
Цель освоения дисциплины
- В ходе обучения студенты изучат виды многозадачности, будут понимать причины возникновения проблем при разработке многопоточных приложений и способы их решения, будут знать, как устроена модель памяти C++ многопоточных приложений, а также виды примитивов синхронизации.
- Обучающиеся получат навыки отладки многопоточных приложений, научатся оценивать производительность приложений, находить узкие места в работе многопоточных приложений с помощью различных инструментов и исправлять их.
- В конце программы учащийся сможет разработать сервер инференса нейронных сетей.
Планируемые результаты обучения
- Знать общие сведения о реализации сокетов в *nix подобных системах, методы их использования на примере обмена в составе модели OSI
- Знать способы реализации чтения/записи в сокет (блокирующий, неблокирующий)
- Уметь реализовывать простейшие сетевые асинхронные приложения на python
- Уметь реализовывать блокирующий ввод/вывод на основе сокетов Беркли
- Знает сведения об устройстве protobuf, видах сообщений, их представлении при передаче (в т.ч. сжатие) и при использовании.
- Умеет писать .proto файлы, встраивать protobuf в сборку программы, использовать его в C++ и Python-коде
- Умеет разрабатывать протоколы клиент-серверного взаимодействия
- Знает общие сведения о возможностях *nix подобных систем для поддержки многопоточных приложений. Способы межпоточного взаимодействия.
- Знает возможности стандартной библиотеки C++ для запуска и завершения потоков
- Умеет использовать стандартную библиотеку C++ для многопоточной обработки данных
- Знает режимы работы программ (системное и пользовательское время).
- Знает виды примитивов синхронизации в *nix-подобных системах, способы их использования с помощью стандартной библиотеки C++
- Умеет использовать профайлировку и инструментирование для оценки производительности приложений
- Умеет использовать примитивы синхронизации стандартной библиотеки C++ для избежания гонок и упрощения многопоточного кода
- Умеет использовать future-семантику для упрощения многопоточного кода
- Умеет использовать thread sanitizer для поиска ошибок в многопоточном коде
- Знает устройство *nix подобных систем в части поддержки асинхронного ввода/вывода
- Умеет проектировать асинхронные приложения и использовать epoll для организации асинхронного ввода/вывода
- Знает принцип работы кооперативной многоздачности (корутин), их виды
- Умеет самостоятельно реализовывать stackfull-корутины
- Умеет применять корутинные движки в реальных приложениях
- Знает принцип создания новых процессов в *nix-подобных системах, прицнипы наследования данных от родительского процесса, CoW
- Умеет реализовывать межпроцессное взаимодействие для передачи задач в системе master/workers.
- Знает принципы работы атомарных переменных.
- Знает устройство кэша процессора и его взаимодействие с RAM. Общие сведения о модели памяти C++, отношение happends before
- Знать организацию межпроцессного взаимодействия - сигналы и shared memor
Содержание учебной дисциплины
- Блокирующий ввод/вывод в *nix системах. Сокеты Беркли. async на питоне
- Стандартизация протоколов общения. Архитектурное ревью. Protobuf
- Ускорение обработки запросов с помощью многопоточного исполнения. Потоки и процессы на уровне ОС. Потоки в C++ (запуск, завершение)
- Профайлировка - sys и user time. Пул потоков. Примитивы синхронизации на уровне ОС и в C++: мьютексы и CV
- Future-семантика и отладка многопоточного кода
- Профайлирование - пример с “медленными” клиентами (которые держат коннект, но редко посылают запросы). Общая идея асинхронного i/o. Epoll
- Корутины: stackfull/stackless. Корутинный движок
- Корутины C++20 и boost::coroutines
- Воркерная модель организации блокирующего i/o. Shared memory
- Атомарные переменные и барьеры памяти
Промежуточная аттестация
- 2025/2026 3rd module0.1 * Коллоквиум 1 + 0.1 * Коллоквиум 2 + 0.3 * Проект + 0.3 * Проект + 0.2 * Экзамен
Список литературы
Рекомендуемая основная литература
- 16581 - Alpina - Параллельное программирование на C++ в действии. Практика разработки многопоточных программ - Э. Уильямс - ДМК Пресс - 2016 - https://hse.alpinadigital.ru/document/16581
- UNIX. Профессиональное программирование, Стивенс, У. Р., 2018
- Структурный подход к программированию, Хьюз, Дж., 1980
Рекомендуемая дополнительная литература
- Современные операционные системы, Таненбаум, Э., 2015