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

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

Автор:

3. Реализации системы тасков на корутинах

+ код

Awaiter::await_suspend() сохраняет адрес корутины и добавляет в список на выполнение.

struct Awaiter {
    void  await_suspend (std::coroutine_handle<> h)  { taskList.push_back( h ); }


В цикле проверяется завершилась ли корутина, иначе возобновляет ее выполнение.
Весь код выполняется в одном потоке, поэтому синхронизации не требуются.

for (; not task_list.empty();)
{
    for (size_t i = 0; i < task_list.size();)
    {
        if ( task_list[i].done() )
            task_list.erase( task_list.begin() + i );
        else {
            task_list[i].resume();
            ++i;
        }
    }
}


Дополнительная фича - co_await может возвращать значение

Size  n = co_await Wait();

В какой-то момент вызывается Size  await_resume(), такая перегрузка соответствует Size co_await <expr>.
Из минусов - не поддерживается [[nodiscard]], поэтому легко забыть возвращаемое значение и компилятор это не заметит.

Страницы: 14 5 6 7 8 Следующая »

#coroutine, #C++

7 ноября 2022

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