Этюды о буферизации. Вадим Винник ➠ CoreHard Autumn 2019
HTML-код
- Опубликовано: 9 фев 2025
- Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединение ожидающих запросов.
Практика разработки конкретного приложения может приводить к постановке задачи, которая, в зрелом размышлении, оказывается достаточно общей, чтобы вычленить её в абстракцию, потенциально полезную для множества различных приложений. Приведение решения к виду, пригодному для многократного применения, в отличие от решения, отвечающего нуждам конкретного приложения, требует дополнительных мыслительных усилий по выделению вариативных аспектов задачи, и по их моделированию средствами языка. В докладе представлен опыт реализации трёх абстракций, объединенных общей темой - буферизацией данных при многопоточной обработке. Показан ход мысли от анализа задачи до реализации средствами языка C++17.
Слайды: www.slideshare...
Join CoreHard community:
CoreHard Telegram t.me/corehard_by
CoreHard Facebook / corehard.by
CoreHard Vkontakte corehardby
CoreHard Instagram / corehard.by
спасибо, очень полезная лекция.
В своё время всё перечисленное я встречал в своих задачах, пилил собственные решения. Сейчас вижу, что, в принципе, везде я угадал пути решения. Но каждый раз, понятно, долго доходил, как именно поступить. Увидел бы я это видео 15 лет назад :D (ролику всего 4 года, увы)
Круто.
Буферизация - это очень простая идиома. В видео же что-то столько всего накручено, что вообще сложно представить когда в этом возникает _реальная_ необходимость, которая _стоила_ бы такого усложнения. ИМХО, этот, как и часть других докладов, нацелен на генерирование и поднятие своей личной стоимости, чем для реального распространения и применения таких идей.
Сразу видно специалиста ничего сложнее HelloWorld в жизни не создавшего...
Решение на 15 сек. может залочиться wait в пустой очереди при захваченном мьютексе не даст сделать put
(вероятно, имеете в виду 15-ю минуту) Не может. Потому что метод wait ждёт при отпущенном mutex - см. en.cppreference.com/w/cpp/thread/condition_variable/wait. Перед вызовом wait семафор нужно захватить. Под блокировкой wait проверяет предикат. Если условие изначально выполнено - с всё ещё захваченным семафором продолжается выполнение кода после wait. Если же условие оказалось ложным, то wait _отпускает_ семафор и впадает в ожидание сигнала от условной переменной. Какой-то другой поток тем временем меняет состояние (то самое, что защищено семафором; имеет право, т.к. семафор свободен!) таким образом, что предикат может стать истинным, и сигналит через condition_variable всем потокам (их могло бы быть несколько), которые ждали изменения состояния (каждый поток при этом может ждать со своим предикатом). Ожидающий поток (в методе wait) просыпается, захватывает семафор (ведь он сейчас будет смотреть в состояние, общее для нескольких потоков), проверяет предикат.
@@vadimvinnik Спасибо за развернутый ответ