Pull to refresh

Comments 17

далее буду называть их корутинами, по‑русски

По-русски, если я верно помню, это называется сопрограммы

хм, а разве "co(ко)" происходит не от cooperate? Кооперативная многозадачность

Под капотом компилятора корутины - это просто синтактический сахар (syntax sugar).

Я бы так не сказал - всё таки нарисовать их вручную на основе другого стандартного функционала (без системно-зависимого кода) проблематично.

Ну, если на то пошло, всё, начиная с ассемблера, -- синтаксический сахар...

Это уж очень глобально. На моё взгляд синтаксический сахар - то, что можно реализовать другими средствами того же языка. Скажем, вместо лямбды для каждого конкретного случая можно явно написать соответствующий функтор с захватом переменных в поля в конструкторе - просто это неудобно. Для реализации корутин надо поработать с контекстом исполнения - а к нему явного доступа нет.

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

сохрани нужные данные в динамически полученной области

Да, так в прицнипе можно. Но разница между таким ручным сохранениям и co_await явно больше, чем случае тех же лямбд и функторов.

Нельзя сделать то же самое что корутины делают внутри.

Компилятор строит таблицы перехода специализированные, память выделяется иначе, для .resume отдельный call convention используется и так далее

а как оно было раньше?
в boost ведь давно корутины есть.

getcontext/setcontext и жонглирование стеками (там же они stackful).

Грязные хаки, как понимаю?

Да не особо грязно, но завязано на детали операционки.

А можно тоже самое, но без динамических аллокаций? Или хотя бы контролируемых.

Без динамических -- нельзя, но можно ж написать свои подпрограммы для выделения/освобождения памяти, и тогда компилятор будет дёргать их, а не свои стандартные. Соответственно, сие можно прилично оптимизировать.

Там можно подкинуть свой алокатор, пишите алокатор на стеке (это не сложно) и будет у вас корутина на стеке

А что такое Coroutine::promise?

Sign up to leave a comment.

Articles