Выложил вторую лекцию по многопоточности на английском языке.
https://youtu.be/kup0qSuJTKM
Во второй лекции мы продолжим разбирать примитивы синхронизации в C++ и перейдём от базовых мьютексов к более сложным механизмам взаимодействия между потоками. Начнём мы с одноразовых событий и связанного с ними классического антипаттерна DCL. Далее мы рассмотрим передачу сигналов между потоками, введём для этого условные переменные и разберём типичные подводные камни, включая спонтанные пробуждения и связанные с ними ошибки. Отдельно обсудим, почему такие ошибки сложно отлаживать и как в этом помогает инструмент strace. Затем мы рассмотрим разделяемые блокировки, обсудим модель их использования и разберём, почему они не являются бесплатным ускорением. В завершение нас ждут ещё несколько антипаттернов, включая рекурсивные мьютексы и мьютексы с ограничением времени. Также мы оценим реальные размеры примитивов синхронизации и их влияние на производительность.
Timeline
00:00 Введение. Одноразовые события.
04:50 Антипаттерн DCL и решение через std::once_flag
12:50 Условные переменные и коммуникация между потоками.
19:15 Внезапные пробуждения на условных переменных.
27:14 Проблемы отладки и полезность strace.
31:22 Разделяемые блокировки.
37:45 Бенчмаркинг разделяемых блокировок: no free lunch.
43:04 Бенчмаркинг: лучший случай для разделяемых блокировок.
50:38 Антипаттерны: recursive_mutex и timed_mutex.
55:47 Размер основных примитивов, завершение, литература.
#cpp_postgraduate
Post #353
8.76K