• A
  • A
  • A
  • АБB
  • АБB
  • АБB
  • А
  • А
  • А
  • А
  • А
Обычная версия сайта
Магистратура 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
  • Атомарные переменные и барьеры памяти
Элементы контроля

Элементы контроля

  • неблокирующий Коллоквиум 1
  • неблокирующий Коллоквиум 2
  • неблокирующий Проект
  • блокирующий Экзамен
Промежуточная аттестация

Промежуточная аттестация

  • 2025/2026 3rd module
    0.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

Авторы

  • Нефедов Сергей Игоревич
  • Манохин Александр Иванович