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

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

Автор:

2. Как прерывать и возобновлять выполнение корутины

+ код

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

Порядок выполнения:


1.  Создается корутина Task  CoroFn () {... и вызывается get_return_object().

  • Task - обертка над coroutine_handle<>, где в конструкторе сохраняется адрес корутины.
  • Task  get_return_object ()  { return Task{ coroutine_handle< promise_type >::from_promise( *this )}; } - создается обертка над корутиной.
  • Task  t = CoroFn(); - адрес корутины сохраняется для дальнейшего использования.


  • 2. Вызывается suspend_always  initial_suspend(), корутина останавливается.


    3. while ( t ) {} цикл пока корутина не завершится.
  • Внутри оператор: operator bool () { return not _handle.done() }
  • Метод done() у корутины возвращает true, когда корутина завершит выполнение.
  • Проверка bool(_handle) и _handle.done() не способна определить, что корутина удалена (неявно или вызовом _handle.destroy()), поэтому код должен гарантировать, что после удаления, корутина больше не используется.


  • 4. while ( t ) { t.Resume(); } в цикле каждый раз возобновляется выполнение корутинывнутри вызывается _handle.resume().


    5. co_await Wait(); - как и в прошлом примере создает Awaiter, у которого await_ready() всегда возвращает false чтобы остановить корутину.


    6. bool  await_suspend (coroutine_handle<>) { return true; } - когда Awaiter останавливает корутину, то вызывается await_suspend().
  • Вариант void  await_suspend() всегда останавливает выполнение.
  • Вариант bool  await_suspend() позволяет остановить корутину вернув true или возобновить корутину вернув false, тогда дополнительно вызовется await_resume().


  • 7. После завершения корутины CoroFn() вызывается suspend_always final_suspend(), где suspend_always не дает неявно удалить корутину.


    8. Цикл while ( t ) завершается, так как _handle.done() вернет true.


    9. В деструкторе ~Task явно удаляется корутина _handle.destroy(), иначе будет утечка памяти.

    Страницы: 13 4 5 68 Следующая »

    #coroutine, #C++

    7 ноября 2022

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