Длительность: 16 ч.
Владелец курса: Замятин Д.
Описание
Курс ориентирован на разработчиков, знакомых с языком программирования C++, но не имеющих опыта разработки конкурентного программного кода.
В курсе подробно рассматриваются сложности, которые возникают при написании многопоточных программ, в частности конкурентный доступ к общему ресурсу и взаимоблокировки. В качестве примеров решения возникающих сложностей приводятся классические задачи: reader-writer problem, producer-consumer problem и задача «об обедающих философах».
Для решения задач применяется широкий спектр примитивов синхронизации, доступных в стандартной библиотеке языка C++, что позволяет совместить изучение фундаментальных вопросов с отработкой практических навыков разработки.
Отдельное внимание уделяется атомарным операциям и написанию lock-free алгоритмов. В связи с этим рассматривается понятие модели памяти, которое чрезвычайно важное для обеспечения корректности работы конкурентных программ и в тоже время достаточно сложное для понимания.
Также в курсе поднимается вопрос обеспечения производительности многопоточных программ, в том числе рассматривается реализация пула потоков.
Разбираемые темы
1. Threads and processes. Concurrency, parallelism and multithreading (теория 0,5 ч)- Как реализована многозадачность в современных операционных системах.
- В чем разница между параллельным и конкурентным выполнением программ .
2. Thread creation and interrupting (теория 0,5 ч, практика 0,5 ч)
- Как создаются потоки выполнения, базовые методы коммуникации между потоками.
3. Data races, deadlocks, bottlenecks (теория 1 ч)
- Какие сложности обычно возникают при написании многопоточного кода, к каким проблемам они могут привести.
4. Synchronization: semaphores, mutexes and conditional variables (теория 1 ч, практика 0,5 ч)
- Обеспечение синхронизации доступа к общим ресурсам при помощи различных примитивов синхронизации.
5. Classical tasks: reader-writer, producer-consumer, dining philosophers (теория 3 ч, практика 6 ч)
- Часто встречающиеся задачи многопоточного программирования на примерах классических задач.
6. Atomic data types, memory model, lock-free algorithms (теория 1 ч, практика 0,5 ч)
- Как обеспечить синхронизацию без мьютексов.
- Атомарные операции и модель памяти.
7. Thread pools (теория 0,5 ч, практика 1 ч)
- Многопоточность не всегда гарантирует производительность. В некоторых случаях необходимы дополнительные решения, такие как пулы потоков.
Цели
- Понять основные сложности разработки конкурентного программного кода и способы их устранения;
- Научиться использовать классические примитивы синхронизации и разобраться с их алгоритмами работы и внутренним представлением;
- Разобрать решения фундаментальных задач параллельного программирования и найти их аналоги в реальных задачах;
- Понять, как работают lock-free алгоритмы.
Целевая аудитория
Основная:- Разработчики со знанием языка C++, не имеющие опыта работы с потоками.
- Архитекторы, системные проектировщики, тестировщики, разработчики, работающие с другими языками программирования, но желающие иметь представление о написании многопоточного кода.