Магистерский курс C++ (МФТИ, 2022-2023). Лекция 23. Сопрограммы, часть 1.

preview_player
Показать описание
Лекции в магистратуре МФТИ по современному C++ на русском языке. Кафедра микропроцессорных технологий.

На этой лекции мы поговорим о сопрограммах. Сначала мы потратим немного времени на обзор разновидностей сопрограмм, потом исследуем их основные части и дальше нас ждёт много интересных упражнений: собственный генератор, исследование объектов ожидания и разбор тонких и сложных проблем.

Лектор: Константин Владимиров.
Дата лекции: 3 мая 2023 года.
Съёмка и звук: Юлий Тарасов.

Timeline:
00:00 Сопрограммы и их разновидности
11:05 Составные части сопрограммы
19:10 std::generator
22:24 Hello coroutine world
34:30 Простой генератор
45:40 Небольшой баг для гурманов
50:40 Range based использование
54:35 Объекты ожидания
01:00:30 Подписка на результат
01:15:29 Преобразования объектов ожидания

Errata:
* Пока пусто
Рекомендации по теме
Комментарии
Автор

Спасибо большое за интереснейшую лекцию. Понял хоть и не всё (С++ не занимаюсь профессионально), но теперь, заглянув немного под капот, сопрограммы не кажутся какой-то магией, как раньше

MrJP-rb
Автор

Для человека, который никогда не слышал про корутины (сопрограммы), эта лекция будет тяжеловатой. Лектор углубляется в тонкости корутин. Надо начинать с простых примеров, а потом углубляться. А лучше даже для начала не углубляться. Переменная типа coroutin_handle - это дескриптор, указывающий на область памяти, в которой сохраняется контекст корутины. На момент, когда корутина приостанавливается, контекст выполнения сохраняется в памяти. Когда выполняется команда на продолжение работы корутины, из памяти восстанавливается контекст и корутина продолжает свою работу.

jbystr
Автор

58:53 "Этот resume еще раз снял нас с final_suspend'а". Насколько можно видеть под дебагом (VS2022), вызов первого resume'а ведет к входу в final_suspend(), но при этом выполнение строки return std::suspend_always() не ведет к возврату управления, т.е. выполнение продолжается. И при следующем resume()'е мы уже не попадем в final_suspend() вообще. Насколько я понял, разница между suspend_always() и suspend_never() в final_suspend() в том, что при suspend_never() handle перестает быть валидным. Поэтому новый вызов resume() может в этом случае привести к segfault (у меня так и есть).

valentynvovk
Автор

Константин, спасибо за лекцию. Посоветуйте, пожалуйста, что можно написать небольшое, чтобы разобраться с кишками корутин -- вашу лекцию второй раз пересмотрел, до этого докладов штуки четыре, и ни то что бы, по ощущениям, в голове много отложилось. Может, вы можете поделиться каким-нибудь вопросом с экзамена?

slimnet
Автор

1:18:12 experimental до сих пор на слайдах
1:20:22 Почему бы просто не вернуть

ddvamp
Автор

Константин, спасибо за лекцию.
32:29 - строка 32, пропущен const?

1:04:12, 1:20:41 - тоже

alex_s_ciframi
Автор

Если ++23 то уже пусть print вместо cout)

Scherbakov
Автор

Ну вот и стоило из-за этого отучать программистов пользоваться GOTO и глобальными переменными? )))

sibedir