No video

C++ lectures at MIPT (in Russian). Lecture 10. Coroutines, part 1

  Рет қаралды 9,761

Konstantin Vladimirov

Konstantin Vladimirov

Күн бұрын

Лекции в магистратуре МФТИ по C++ на русском языке.
На этой лекции мы вступим на неисследованную территорию программирования с использованием сопрограмм. На первой лекции рассматривается общая схема сопрограммы и её жизненный цикл в простых случаях.
Лектор: Константин Владимиров
Дата лекции: 10 декабря 2019 года
Съёмка и звук: Дмитрий Рябцев
Предыдущая лекция: • C++ lectures at MIPT (...
Следующая лекция: • C++ lectures at MIPT (...
Слайды ко всем лекциям: sourceforge.ne...
Errata:
* 18:11 co_return не содержит co_await напрямую, что логично, результат return_void/return_value не awaitable. Вместо этого делается переход на выражение co_await promise.final_suspend() происходит.
* 56:10 вызывается handle.resume() независимо от handle.done(), хотя !handle.done() должно являться предусловием для возможности сделать resume
* 1:19:13 -- начиная с C++11, list::size имеет константную сложность

Пікірлер: 25
@jupel
@jupel 3 жыл бұрын
Спасибо. Очень доступное объяснение.
@MonahTuk
@MonahTuk Жыл бұрын
Наконец-то нашёл время посмотреть. И наконец-то хоть что-то стало в голове укладываться. Не катарсис, но близко.
@tilir
@tilir Жыл бұрын
Скоро будет гораздо лучшее изложение в новом курсе этого года ))
@MonahTuk
@MonahTuk Жыл бұрын
Обязательно посмотрю. Пока нужно найти время на ДЗ на 58 минуте)
@defvyb
@defvyb Жыл бұрын
Спасибо за видео. Разослал коллегам по цеху, чтобы им стало чуточку понятней :)
@tilir
@tilir Жыл бұрын
Это устаревшая лекция. Разошлите пожалуйста лекции по корутинам последнего магистерского курса. Там всё то же но точнее лучше и яснее.
@DART2WADER
@DART2WADER 3 жыл бұрын
Выражаю огромную благодарность за столь понятное и достаточно полное разЪяснение работы сопрограмм. Я раскидал везде std::cout
@tilir
@tilir 3 жыл бұрын
Я люблю для таких целей использовать callgrind и потом callgrind_annotate
@DART2WADER
@DART2WADER 3 жыл бұрын
@@tilir это под линуксом только?
@usser-0bYdldQ
@usser-0bYdldQ 28 күн бұрын
Язык plsql oracle 9 еще в 2001 году умел делать корутины , правда называлось pipelined functions. Что говорится "отрадясь такого не было и вот опять"
@ivankorotkov2563
@ivankorotkov2563 3 жыл бұрын
Спасибо. Очень насыщенный материал. PS: я бы предложил вместо handle_ ? (handle_.resume(), !handle_.done()) : false написать handle_ && (handle_.resume(), !handle_.done()), а вместо splice для списка использовать std::swap) PPS: изначально предложил мув конструктор, но потом понял что в общем случае не факт что контейнер можно использовать после мува. В интернетах предлагают после мува еще clear() сделать, но свапнуть яснее. Еще по поводу resumable_no_own::promise_type::get_return_object. Мне кажется проще написать его так: resumable_no_own get_return_object() { return {}; }, при этом сама структура resumable_no_own избавляется от всех методов, и содержит только struct promise_type. Выглядит проще чем конструировать coroutine_handle, а затем неявно кастовать ее к resumable_no_own. Но не уверен, возможно тут есть какие-то причины конструировать именно через coroutine_handle.
@MrSnarpix
@MrSnarpix 4 жыл бұрын
get_return_object() должен возвращать нечто, что хранится до первой точки останова. Только после этого происходит конструирование return_object, из того что вернулось из get_return_object(). Это было одно из отличий между имплементациями VC++ и Сlang, в стандарт пошла версия Сlangа.
@tilir
@tilir 4 жыл бұрын
Хорошее замечание. В следующих лекциях будут более сложные примеры. Возможно я где-то из-за этого наступлю на конкретные проблемы. А может и нет =)
@user-sz7kt8nf1m
@user-sz7kt8nf1m 3 жыл бұрын
Отличная лекция. Жаль, что так мало лайков ставится под такими полезными вещами
@e47ca0ef
@e47ca0ef 2 жыл бұрын
Спасибо за лекцию. В примере с consumer/producer не очень понятно, зачем нужен флаг evt_awaiter_t::set_. Всё равно не может произойти такая ситуация, что producer вызовется до того, как consumer дойдёт до следующей точки приостановки. Т.е. никто не выставит этот флаг в True, пока все consumers не приостановят своё выполнение. Более того, этот флаг идёт вразрез с семантикой "пробуждаем всех consumers" по наступлению одного события, т.к. он сбрасывается после пробуждения первого же consumer, т.е. привносит нотки семантики "пробуждаем одного consumer" на одно событие.
@alexloktionoff6833
@alexloktionoff6833 Жыл бұрын
Говорят, что в С++23 завезут корутины и можно будет писать очень просто, будет новая лекция? // Coroutine that waits for two slow operations to complete and returns their results std::future wait_for_slow_operations() { auto result1 = slow_operation(1, 3); auto result2 = slow_operation(2, 5); std::string result = co_await result1; result += " " + co_await result2; co_return result; } int main() { // Call the wait_for_slow_operations coroutine and print its result std::cout std::string { return co_await wait_for_slow_operations(); }).get()
@tilir
@tilir Жыл бұрын
Да скоро в обновленном курсе про это поговорим. Я там отложил корутины на конец.
@denisfedotov6954
@denisfedotov6954 3 жыл бұрын
Слайд 11содержит ошибки. co_return не содержит co_await, что логично, результат return_void/return_value не awaitable
@denisfedotov6954
@denisfedotov6954 3 жыл бұрын
при этом goto на выражение co_await promise.final_suspend() происходит.
@tilir
@tilir 3 жыл бұрын
Спасибо, точное замечание. Добавил в errata.
@user-yd7ds6po4l
@user-yd7ds6po4l 4 жыл бұрын
std::list::size() с неконстантной сложностью - это что-то из времён pre-C++11, очень странно подобное слышать в контексте корутин
@tilir
@tilir 4 жыл бұрын
Речь об 1:19:13, я полагаю? Да это очевидная ошибка, я внесу в errata. Она связана с некоей методической историей. У меня есть лекции для второго курса и там у меня долго был красивый пример этого инженерного решения из 90-х, что мол есть trade-off между size и splice и круто что выбрали splice и т.д. И только этой весной мне указали, что давно уже size за O(1) по стандарту. К счастью большая часть частных случаев сплайса тоже была сохранена константной, неконстантный сплайс сделали только самый общий. Так что в целом я тут ничего не порчу, но да. Обидно. Вообще крупные изменения нам заметны куда сильнее чем мелкие. Я боюсь у меня в лекциях есть ещё много мест где я ориентируюсь на тот язык, который в своё время учил, а не на тот, какой он сейчас.
@MonahTuk
@MonahTuk 3 жыл бұрын
@@tilir А можете прочитать курс лекций по реакции на замечания и принятия критики?
@jollu8
@jollu8 2 жыл бұрын
шли просмотра 1000+ а вдруг стали 5000+ )
@tilir
@tilir 2 жыл бұрын
О такое бывает. У меня в бакалаврском курсе ещё загадочней: есть видео на 800 потом на 4к потом на 900 потом на 2к и все эти видео по порядку. Я многого не понимаю про алгоритмы ютуба.
C++ lectures at MIPT (in Russian). Lecture 10. Coroutines, part 2
1:35:38
Konstantin Vladimirov
Рет қаралды 3,9 М.
C++ Lectures at MIPT (in Russian). Lecture 1. Strings.
1:23:21
Konstantin Vladimirov
Рет қаралды 35 М.
这三姐弟太会藏了!#小丑#天使#路飞#家庭#搞笑
00:24
家庭搞笑日记
Рет қаралды 92 МЛН
Happy birthday to you by Tsuriki Show
00:12
Tsuriki Show
Рет қаралды 12 МЛН
what will you choose? #tiktok
00:14
Анастасия Тарасова
Рет қаралды 6 МЛН
Back to Basics: Concurrency - Arthur O'Dwyer - CppCon 2020
1:04:28
ТиПМС 10. Stackless coroutines, C++ coroutines
2:58:13
Лекторий ФПМИ
Рет қаралды 2,9 М.