Войти
ПрограммированиеСтатьиОбщее

С++ корутины, начальный уровень (7 стр)

Автор:

5. Как организовать зависимости между корутинами

+ код_вариант1
+ код_вариант2
+ код_вариант3



Корутины:

Task    t0 = [] () -> Task
{
    co_return;
}();
        
Task    t1 = [] (Task &t0) -> Task
{
    co_await TaskRef{ t0 };
    co_return;
}( t0 );

Вторая корутина зависит от первой, для этого используется Awaiter с данными:

struct Awaiter
{
    Task const&     _task;

    bool  await_ready () const                      { return _task._handle.done(); }
    void  await_resume ()                           {}
    void  await_suspend (std::coroutine_handle<>)   {}
};

await_ready() проверяет, завершилась ли корутина, от которой зависит текущая корутина.
await_suspend() для упрощения кода здесь не используется, корутины вручную возобновляются в разном порядке.


Для экономии на копировании данных, реализация позволяет хранить ссылку.
Порядок выполнения выглядит так:

co_await TaskRef{ t0 };
🔻
struct TaskRef {
    Task const&     ref;
};
🔻
Awaiter  operator co_await (const TaskRef &task) {
    return {task.ref};
}
🔻
struct Awaiter {
    Task const&     _task;
};
🔻
void  Awaiter::await_suspend (std::coroutine_handle<> h) {
    h.promise().GetTask().AddDependency( _task );    // пример использования
}
🔻
Awaiter::~Awaiter() {}
TaskRef::~TaskRef() {}
Страницы: 13 4 5 6 7 8 Следующая »

#coroutine, #C++

7 ноября 2022

Комментарии [58]