Здравствуйте, Videoman, Вы писали:
V>Твой WaitingBlock сейчас везде называется Promise. Это не проблема и есть уже давно. Смотри пара std::promise/std::future. Проблема же не в отложенном ожидании как таковом, а в восстановлении всего контекста ожидания, что бы продолжить бизнес логику дальше, с того же места, где она прервалась на ожидание.
Не-а. promise/future — это примитивы. Если их прямо использовать, то понять что-либо будет несколько затруднительно. Поэтому я и предлагаю сделать обвязку в виде функциональных объектов. Комбинация таких объектов позволит организовывать код в простую и понятную последовательность.
| | Скрытый текст |
| | V>Вот пример:V>result class::some_method1(params1_t... params)
V>{
V> Что создаем на стеке (1)
V> Что создаем на стеке (2)
V> Что создаем на стеке (3)
V> wair_for_io_operation (1)
V> wair_for_io_operation (2)
V> Что создаем на стеке (4)
V> Что создаем на стеке (5)
V> Что создаем на стеке (6)
V> wair_for_io_operation (3)
V> wair_for_io_operation (4)
V> Очищаем созданное на стеке (1)
V> Очищаем созданное на стеке (2)
V> Очищаем созданное на стеке (3)
V> Очищаем созданное на стеке (4)
V> Очищаем созданное на стеке (5)
V> Очищаем созданное на стеке (6)
V>}
V>result class::some_method2(params2_t... params)
V>{
V> Что создаем на стеке (1)
V> Что создаем на стеке (2)
V> Что создаем на стеке (3)
V> wair_for_io_operation (1)
V> wair_for_io_operation (2)
V> Что создаем на стеке (4)
V> Что создаем на стеке (5)
V> Что создаем на стеке (6)
V> wair_for_io_operation (3)
V> wair_for_io_operation (4)
V> Очищаем созданное на стеке (1)
V> Очищаем созданное на стеке (2)
V> Очищаем созданное на стеке (3)
V> Очищаем созданное на стеке (4)
V> Очищаем созданное на стеке (5)
V> Очищаем созданное на стеке (6)
V>}
V>
|
| | |
Нужно иметь возможность выполнять эти два метода параллельно, в зависимости от того, как завершаются операции ввода-вывода. В С++20 корутины между вызовами сохраняют объекты выделенные на стеке в куче и после ожидания заново копируют на стек в том же состоянии, для продолжения выполнения с прерванной точки. Как такое можно сделать на С++17 по твоему?
Насколько я понимаю, корутины в С++20 достаточно бесполезны. Нужно сразу С++23, в котором являются объекты, позволяющие нормально организовать код. Честно говоря, я не понимаю зачем понадобилось вводить ключевые слова, вроде co_yield. Для совмещения параллельности выполнения с ленивыми вычислениями мне это кажется излишним.
Вот если мы создали какой-то ленивый объект. Он хранит одно состояние и умеет переходить в следующее при выдаче результата. Хорошо. Очевидно, что если внутри этого объекта реализовать некое вычисление следующего состояния параллельно к работе основного потока, то мы получим сопрограмму. Чем это принципиально отличается от корутин —

Зачем нужны co_await с co_return'ами —
Вот если посмотреть на тот псевдокод, что вы написали, то можно заметить, что он написан исключительно в процедурном стиле, здесь создаём, тут ждем, там запускаем. А где место объекту? Если же начать думать в парадигме объектов, то всё станет намного проще. Собственно, не спроста в C++23 пришли std::generator. Это закономерный и, к моему сожалению, эволюционный путь развития.