Выложил первую лекцию по атомикам на английском языке.
https://youtu.be/dRlOwdj8BHI
В этой лекции мы начнём переход к настоящему lock-free программированию. Для этого нам понадобится серьёзная база в атомиках C++. Первое, что мы сделаем в начале лекции, -- это мотивируем атомик через конкретный пример контрольного блока shared_ptr и убедительный бенчмаркинг. Далее, рассматривая обычный инкремент, мы изобретём идиому Compare-And-Swap (CAS). Центральным понятием лекции является lock-freeness. Мы разберём иерархию гарантий прогресса, а также вернёмся к классическим антипаттернам, вроде double-checked locking, и покажем, как их корректно реализовать с помощью атомиков. Отдельно обсудим статическую инициализацию и thread-local переменные. Во второй половине лекции мы перейдём к более сложной теме -- API races. Посмотрим, как такие ошибки возникают даже при использовании атомиков, и почему их сложно обнаружить, в частности обсудим подход через формальную верификацию. Закончим мы разбором ситуаций активной блокировки.
Timeline
00:00 Intro. Контрольный блок для разделяемого указателя и снова data race.
04:30 Проблема контрольного блока. Бенчмаркинг atomic vs mutex.
10:25 Дуальность синхронизации. Какой единственный тип должен быть действительно атомарным.
17:30 Проблема инкремента для аомика. Мотивация для CAS.
28:24 Концепция lock-freeness и иерархия свободы.
38:45 Снова антипаттерн DCL. Чиним через атомики.
45:10 Синглтон Майерса: синхронизация вокруг статических переменных. Thread local переменные.
50:15 Снова Copy On Write: проблемы в простом COW подходе.
56:57 Поиск API Races в коде, активно использующем атомики.
01:04:30 Методы формальной верификации для поиска API races.
01:08:46 Завершение: livelocks и литература.
#cpp_postgraduate
Post #358
8.38K