ru
Feedback
C++ and other lectures

C++ and other lectures

Открыть в Telegram

Учебный канал в Телеграм: тут будут анонсы и ссылки на лекции и стримы. Написать автору: @Tilir Boosty автора: https://boosty.to/cpp_lects_rus

Больше
9 609
Подписчики
+1224 часа
+157 дней
+9930 день
Архив постов
Выложил вторую лекцию по многопоточности на английском языке. 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

Всем привет. Очередной стрим для подписчиков проведу на boosty 5 апреля в 19 часов по Москве. Планируется к детальному обсужд
Всем привет. Очередной стрим для подписчиков проведу на boosty 5 апреля в 19 часов по Москве. Планируется к детальному обсуждению программа предстоящей C++ Russia (благо она уже есть и собрана). Кроме того обсудим главы 1.4 -- 1.6 и расскажу как идёт работа над второй частью книги. Ссылки на предыдущие стримы: 1. https://t.me/cpp_lects_rus/338 2. https://t.me/cpp_lects_rus/346 Ссылку на стрим заброшу в чат в воскресенье днём. Стрим будет по студенческому доступу. Вопросы можно накидывать уже сейчас: https://www.donationalerts.com/r/cpp_lects_rus #official #boosty

Выложил первую лекцию по многопоточности на английском языке. https://youtu.be/Z5BJyUfPivg В этой лекции мы начнём длинный путь в многопоточность на C++. Мы стартуем с самых основ. Обсудим, что такое поток исполнения в модели языка, чем логическая многопоточность отличается от аппаратного параллелизма, что такое область памяти и как возникает гонка данных. Разберём, почему наивные решения, вроде volatile или привязки потоков к ядрам, не решают проблему синхронизации. Далее мы перейдём к базовым примитивам синхронизации -- мьютексам -- и обсудим, как их использовать с помощью RAII. Нам придётся ввести концепцию безопасности относительно потоков, подобно тому, как в языке существует понятие безопасности относительно исключений. На примере простого буфера мы увидим, как легко получить ошибки проектирования даже при "очевидной" защите довольно простого класса, и введём понятие API race. В завершение мы рассмотрим одну из классических проблем -- дедлоки -- и разберём задачу об обедающих философах как иллюстрацию того, насколько сложной может быть корректная синхронизация и как язык C++ нас в этом поддерживает. Timeline 00:00 Введение. Что такое поток исполнения? 08:14 Области памяти и гонка (data race). 14:18 Немного про volatile и почему это плохое решение. 18:38 Немного про POSIX affinity и почему это плохое решение. 26:00 Базовая синхронизация: mutex. 30:43 Безопасность относительно исключений и безопасность относительно потоков. 37:07 Попытка построить thread-safe буфер. 41:45 API races как проблема проектирования безопасных контейнеров. 52:20 Deadlocks и Dining Philosophers. 01:00:06 Завершение и список литературы. #cpp_postgraduate

Выложил лекцию по динамическому полиморфизму на английском языке. https://youtu.be/-hAxKYFY_7c В этой лекции мы поговорим про динамический полиморфизм в C++ -- одну из самых неоднозначных и часто неправильно понимаемых тем языка. Мы обсудим, зачем он вообще нужен, какие реальные задачи он решает и почему полностью отказаться от него не получается. Разберём классическую реализацию через виртуальные функции, их стоимость, ограничения и подводные камни -- включая множественное наследование, RTTI и dynamic_cast. Далее мы рассмотрим альтернативы: CRTP и ручное управление таблицами диспетчеризации, их плюсы и минусы. В конце придём к более современным подходам -- инверсии полиморфизма и семантике значения в духе Шона Парента, где динамический полиморфизм скрыт внутри и не протекает в пользовательский код. Лекция оставляет открытым вопрос о том, как же правильно сочетать языковые механизмы и библиотечные абстракции и есть ли у динамического полиморфизма окончательное решение в современном C++. 00:00 Введение, мотивация для динамического полиморфизма. 03:40 Виртуальные функции и полиморфные интерфейсы. 12:22 Альтернатива: интерфейсы через CRTP. 16:25 CRTP mixins и немного deducing this. 24:45 Множественное наследование и симметрия RTTI-механизмов. 31:00 Виртуальное наследование. 37:06 dynamic_cast и его три смысла. 46:45 Снова о мотивации рантайм-полиморфизма и критика виртуальных функций. 51:18 Проблема Дионне и её разнообразные решения. 01:00:50 Решение Шона Парента: переиспользование и скрытие полиморфизма. 01:04:00 Открытый финал и список литературы. #cpp_postgraduate

Всем привет. Выложил главы 1.4 -- 1.6 и задания к первому разделу для моей книги про C++ https://boosty.to/cpp_lects_rus/posts/eeee2a76-c1be-46e5-a248-c8c1eb62fae8 Также обновил пост с главами 1.1 -- 1.3. Для тех кто уже купил можно бесплатно перескачать и я рекомендую это сделать, там есть изменения. https://boosty.to/cpp_lects_rus/posts/5029d95f-831c-4262-9002-19ce8ea5208a Спасибо всем моим подписчикам на boosty за поддержку которая вдохновляет меня работать над этой книгой и подписчикам уровня principal за участие в ревью. Если вы ещё не подписались, рассмотрите возможность это сделать. Минимальная подписка это совсем недорого. Ну и конечно буду рад отзывам комментариям и предложениям и на boosty и здесь в комментариях к посту. #cppbook #boosty

Выложил лекцию по умным указателям на английском языке. https://youtu.be/6w_1HcLoeg4 В этой лекции мы обсудим умные указатели в C++ и то, как они помогают управлять различными ресурсами, включая память. Мы начнём с перечисления альтернатив, включающих семантику значения и разные виды умных указателей, и в ходе лекции разберём детали каждого из них. Отдельно мы остановимся на двух основных механизмах, предоставляемых стандартной библиотекой C++ -- уникальных указателях и разделяемых указателях. В случае уникальных указателей мы также протянем связь с прошлой лекцией и обсудим, как они взаимодействуют с аллокаторами. Для разделяемых указателей мы рассмотрим типичные проблемы общего владения: циклические ссылки, использование weak_ptr, aliasing-конструкторы, enable_shared_from_this, а также распространённые ошибки вроде создания нескольких контрольных блоков для одного объекта. Завершим лекцию несколькими тизерами применения разделяемых указателей в многопоточной среде. 00:00 Введение: семантика значения и альтернативы для умных указателей. 08:05 Некопируемые неперемещаемые значения и prvalue elision. 11:35 Перемещаемые объекты и их возврат из функций. 18:05 Тонкости make_unique и организация делетера. 25:16 Unique pointers и аллокаторы. 32:15 Мотивация и проектирование разделяемых указателей. 38:59 Проблема владения контрольным блоком и расползание разделяемых указателей по коду. 47:50 Ковариантность разделяемых указателей и снова делетеры. 56:30 Зацикливание разделяемых указателей и weak pointers. 01:04:22 Настоящая стоимость make_shared. 01:08:30 Тизеры относительно применения в многопоточности, список литературы, завершение. #cpp_postgraduate

Выложил вторую часть лекции по аллокаторам на английском языке. https://youtu.be/naiLRcS3chU Эта лекция продолжает наше обсуждение аллокаторов в C++. Мы начнём с идеи memory_resource и внезапно выясним, что полиморфизм времени выполнения оказывается неожиданно удобным инструментом для его реализации. Затем мы разбираем стандартные ресурсы, поставляемые библиотекой — такие как monotonic и multipool resources — и посмотрим, как они используются через polymorphic_allocator и контейнеры семейства PMR. Далее мы реализуем простой тестовый memory resource, чтобы посмотреть, как именно проходят выделения памяти через PMR и что такое стандартный ресурс по умолчанию. После этого, на примере известного примера Пабло Халперна с односвязным списком, мы разберём, как аллокаторы взаимодействуют с дизайном контейнеров, включая вопросы big-five и правила распространения аллокаторов. В конце мы проведём сравнение стоимости разработки при различных подходах к абстракции аллокатора. 00:00 Introduction: runtime polymorphism for memory_resource 06:15 Standard resources: monotonic and multipool 12:15 Polymorphic allocator and PMR containers 19:16 Test memory_resource: PMR and the default resource 25:52 Halpern example: slist and its design details 31:40 Allocators and the Big Five for slist 40:22 Exception safety strikes back 46:00 Preserving noexcept in the move constructor 53:06 Why are we not afraid of virtual calls? 56:53 Halpern's table, final thoughts, and bibliography #cpp_postgraduate

Провёл вторую встречу с подписчиками. https://boosty.to/cpp_lects_rus/posts/949347c9-27ef-405a-8452-205954a7e25a Получилось всё так же тепло и лампово, как мне кажется. Что логично, учитывая лимитированность аудитории платными подписчиками. Решил также оставить запись пока в открытом доступе. Notable timesteps: 12:15 Одна забавная деталь в примере на вывод типов из этого поста: https://t.me/cpp_lects_rus/343 48:22 Новый алерт в виде поняши. 01:18:35 Пара официальных заявлений насчёт Max и всего такого. 01:51:13 Разбор доклада Сергея Чеботарёва про модули. Кстати вот сам доклад: https://www.youtube.com/watch?v=09jrHMzFjCw #official #author_event

Временный пост (снесу по завершению стрима). Стрим на бусти сегодня в 21-00. Ссылка: https://boosty.to/cpp_lects_rus/streams/video_stream Вопросы можно накидывать уже сейчас: https://www.donationalerts.com/r/cpp_lects_rus

Первая лекция второй части моего англоязычного курса по С++ доступна на Youtube. https://www.youtube.com/watch?v=Q3ytjLP5NyA Эта лекция начинает глубокое погружение в аллокаторы C++. Мы начнём с глобального (C-style) выделения памяти и исторической мотивации появления пользовательских аллокаторов в раннем C++. Затем разберём две фундаментальные проблемы их дизайна -- взаимозаменяемость и переход между разными типами аллокаторов. Через серию практических примеров -- включая freelist allocator -- мы исследуем, что именно идет не так на практике, почему дизайн аллокаторов оказывается неожиданно тонким и сложным, и как разделяемое состояние и правила продвижения аллокаторов усложняют реализацию контейнеров. Далее мы рассмотрим идею отделения стратегии выделения памяти от самих контейнеров, закладывая основу arena-based подхода, и проанализируем проблемы управления локальными аллокаторами внутри контейнеров. Эти проблемы впоследствии мотивировали изменения стандарта, но это мы оставим на следующую лекцию. Timeline: 00:00 Начало. Пара слов про глобальные (C-style) аллокаторы. 04:51 Мотивация аллокаторов в раннем C++ 09:49 Две важные проблемы: Interchangability и Rebinding 14:43 Logging Allocator Case Study 19:25 Weasel Words and C++11 Allocators Motivation 28:10 Case Study: Freelist Allocator и его проблемы 40:04 Разбор и починка причин проблем: Shared Freelist 52:10 Separating Resource: основы Arena-Based подхода 55:00 Case Study: Small Vector 01:01:38 Allocator Instances Hell: Halpern's Case and Scoped Allocators 01:08:26 Проблемы классических аллокаторов, тизер на следующую лекцию и список литературы. #cpp_postgraduate

Всем привет. Сегодняшний пятничный чилаут будет посвящён выводу типов для множеств перегрузок (да, продолжаю готовиться к C++ Russia). В принципе с этим нет проблем, особенно если мы подсказываем что делать.
int bar(int) { return 0; }
int bar(double) { return 1; }

template <typename T>
int foo(T t, int (*)(T)) { return bar(t); }

foo(42, &bar); // OK, T -> int
https://godbolt.org/z/fT1oondqs Но это в принципе, а в общем случае, что будет, если мы подскажем не всё?
int bar(int, char) { return 0; }
int bar(double, long) { return 1; }

template <typename T, typename U>
int foo(T t, int (*)(T, U)) { return bar(t, 0); }

foo(42, &bar); // OK?
https://godbolt.org/z/K5qjYW4d1 Тут мнения gcc и clang расходятся. Один компилятор (gcc) считает, что ему подсказали достаточно. Другой (clang) говорит "candidate template ignored: couldn't infer template argument 'U'". А вы что скажете? Как обычно ожидаются ссылки на стандарт. #questions

Несколько объявлений. (1) Поскольку на прошлом стриме был запрос на обзор последнего CppCon, начну потихоньку публиковать на
Несколько объявлений. (1) Поскольку на прошлом стриме был запрос на обзор последнего CppCon, начну потихоньку публиковать на boosty по три доклада. Первый пост (всего будет 5-6). https://boosty.to/cpp_lects_rus/posts/23221965-bb69-423e-85e8-f01156805405?share=post_link Внутри скриншоты, таймлайны и какие-то мои мысли насчёт того почему доклад удачный или почему нет. Первая тройка -- абсолютный, но при этом и очевидный must see в моём понимании. Своего рода консервативная инвестиция вашего времени. Следующая тройка будет более внезапной. Доступ решил выставить джуновый т.к. студенты должны смотреть скорее лекции чем доклады )) (2) Очередной стрим для подписчиков проведу 1-го марта в 21 час по Москве. Прошлый стрим можно посмотреть тут: https://t.me/cpp_lects_rus/338 Первые минут двадцать поболтаю про то как движется прогресс по книге по C++ (главы 4, 5 и 6) и про внезапный соевый протест, который тут недавно случился у меня на канале. Также расскажу про свои планы на конференции этого года: C++Russia, PHDays, Zero Cost. Ссылку на стрим заброшу в чат в воскресенье днём. Стрим будет по студенческому доступу. Вопросы можно накидывать уже сейчас: https://www.donationalerts.com/r/cpp_lects_rus (3) Выкладку лекций магистерского курса на английском начну в эту субботу 28 февраля. Первая появится онлайн в 7 вечера по Москве. #official #boosty

Я забыл написать на прошлой неделе, что всё-таки успел подать заявку на C++Russia этого года с увлекательным докладом о семантических процессах, уже третьим в серии. На этот раз будем говорить про вывод типов (в сочетании с перегрузкой). В связи с этим могу предложить аудитории небольшую проблемку. Да я знаю что не пятница, но в пятницу я буду в самолёте в Йошкар-Олу, где я буду читать лекцию по современным методам рекламации памяти. Так что давайте скажем, что среда это маленькая пятница.
template <auto f = []{}> struct S {}; 
S x, y;

static_assert(std::is_same_v<decltype(x), decltype(y)>);
https://godbolt.org/z/qEehP4aMv Clang отказывается компилировать declaration. GCC компилирует, но проваливает static_assert. На чьей вы стороне? #questions

Всем привет. Завел приватный канал в мессенджере Max. Сделать публичный пока не даёт. Буду его использовать как дубль дискорда. Там будут появляться ссылки на лекционные стримы. Можно присоединяться: https://max.ru/join/tUgCa6XnmjppjHzWO1ufz59pOE7wlIkYpqHnxtuPrHs #official

Продолжаю хвастаться своими студентами и коллегами. https://www.youtube.com/watch?v=XrnHwLWmrWQ Выложили доклад Юлия Тарасова на sysconf. Юлия вы его уже видели у меня на канале -- мы с ним докладывали про корутинные оптимизации в компиляторах. Здесь он выступает с докладом про поддержку аппаратных точек останова в отладчиках. К слову, Юлий является автором первого прототипа реализации debug spec 1.0 для RISC-V то есть тема для него знакомая. Ну и доклад интересный. 00:50 Начало 02:07 Типичные подходы к отладке: break и step 07:02 Watchpoints, устройство и ограничения software watchpoints 13:45 Аппаратные watchpoints: идея и бенчмарк-мотивация 20:04 Реализация аппаратных watchpoints в отладчиках и операционных системах: ptrace API 27:30 Что скрывается за ptrace? 33:20 Интегрируем всё это в отладчик (gdb native) 35:20 Вопросы Очень рекомендую особенно тем кто хотел больше информации о том как вообще работают отладчики. #conference

Провёл стрим для подписчиков на boosty. Мне понравилось, в целом получилась полноценная виртуальная встреча с читателями. Люд
Провёл стрим для подписчиков на boosty. Мне понравилось, в целом получилась полноценная виртуальная встреча с читателями. Людям вроде бы тоже зашло, даже какие-то донаты были. Сервис разрешил после завершения открыть запись для всех желающих. Какое-то время побудет открытой, потом спрячу под минимальный (студенческий) доступ. https://boosty.to/cpp_lects_rus/posts/ce8d4c28-d88f-4054-bce2-d652893a7670 Have fun. #official #author_event

Временный пост-напоминалка, снесу после завершения стрима. Стрим для подписчиков на boosty пройдёт в субботу 7 февраля в 21-00 по Москве (то есть уже завтра или даже уже сегодня в зависимости от того когда вы читаете это сообщение и из какой тайм-зоны). https://boosty.to/cpp_lects_rus/streams/video_stream Круг тем для разговора примерно как на обычной встрече с читателями: образование, языки программирования, искусственный интеллект, всё такое. Первые минут двадцать расскажу о компиляторной книжке: в чём был её замысел, как она устроена, что и почему в неё не вошло. Дальше буду отвечать на вопросы (из чата или с донатов, как пойдёт). Можете заранее накидать вопросов: https://www.donationalerts.com/r/cpp_lects_rus #official #boosty

Неделя на бусти: итоги. Прошла неделя с тех пор как я создал аккаунт https://boosty.to/cpp_lects_rus для поддержки моей деятельности. 1. Спасибо всем кто на меня подписался, особенно за подписки старших уровней. По итогам недели у меня 61 платный подписчик (из них 44 -- младших уровней, студенты и джуны) и 48 покупок поста с первыми тремя главами без подписки. Немного, но лиха беда начало. 2. Обновил (мелкий багфикс и вёрстка плюс индекс и литература) пост с первыми тремя главами: https://boosty.to/cpp_lects_rus/posts/5029d95f-831c-4262-9002-19ce8ea5208a кто купил пост или у кого есть подписка можете перескачать. 3. Завёл принципальский чатик (для людей с уровнем подписки principal и выше) где уже обсуждаем главу 4. Главы 5 и 6 продвигаются своим чередом. Ну и я теперь официально могу сказать, что мотивации писать книгу у меня резко прибавилось. В следующую субботу 7 февраля, в 21-00 по Москве, я сделаю виртуальную встречу с подписчиками в виде классического стрима на boosty с вопросами из donationalerts. Стрим будет открыт подпиcчикам от студента и выше. Заодно разберусь как это делается. Обычные оффлайн-встречи проходили отлично и беседа всегда была интересной. Может быть формат стрима также всем зайдёт (и к тому же его можно будет пересматривать). Ну и 128 рублей за билет -- недорого. Минимум за платный вопрос сделаю 512, но если платных вопросов не будет, просто поотвечаю на вопросы из чата трансляции. Сразу предупрежу -- никакой голосовой озвучки донатов не будет. Можете кстати заранее накидать вопросов: https://www.donationalerts.com/r/cpp_lects_rus #official #boosty

Немного о текущих событиях. Прочитал гостевую лекцию в ГУП Мосгортранс по новым механизмам рекламации памяти в C++26 (rcu и h
Немного о текущих событиях. Прочитал гостевую лекцию в ГУП Мосгортранс по новым механизмам рекламации памяти в C++26 (rcu и hazard pointers). Ребята делают многопоточный беспилотный трамвай на C++. Уже страшно? Я вам больше скажу -- такие трамваи уже вышли на улицы Москвы. Было классно, спасибо всем кто пришёл. Не знаю велась ли запись, но если нет, то к лучшему, так как лекция была очень черновая. Я её ещё раза два-три прочитаю, а потом выложу для своего канала (ну и часть материала пойдёт в новый магистерский курс). Это была первая моя лекция, где присутствующим официально принесли попкорн -- на каждом столе стоит ваза с сухофруктами и орешками. Офис Мосгортранса -- в целом моё почтение, широко живут люди. P. S. Меня можно пригласить в вашу компанию с гостевой лекцией или на встречу с читателями или на то и другое. #author_event

Итак, в опросе содержательно проголосовали более 1800 человек (и ещё почти 400 просто сделали тыц). Из содержательно проголосовавших большинство (почти 900 человек) проголосовало за бусти. Спасибо за такую поддержку, я сделал. https://boosty.to/cpp_lects_rus Посты с выкладкой книжки можно купить без подписки, выкладка по несколько глав, цена 50 рублей за главу. То есть первые три за 150. Имеет смысл купить даже первые три т.к. я буду по мере написания книги модифицировать посты, внося туда изменения и фиксы, а доступ у вас останется, я проверил. Конечно подписчикам даже минимального тира все эти посты будут доступны бесплатно. Вряд ли вы сильно сэкономите, минимальный тир стоит примерно как две главы в месяц а я вряд ли буду столько писать. Так что будем считать что подписки -- просто для поддержки канала. Ну и теперь у всех есть возможность поддержать канал. По мере набора подписичков, буду дополнять контент. Например устраивать на бусти стримы с такими своего рода онлайн встречами с читателями. Ну и вообще что-нибудь придумаю. #official