Подтвердить что ты не робот

В каком контексте будут выполняться возобновляемые функции в С++ 14?

Одно из предложений для С++ 14 - Возобновляемые функции, которое дает С++ то, что доступно на С# сегодня, с механизмами async/await. Основная идея заключается в том, что функция может быть приостановлена ожидая завершения асинхронной операции. Когда асинхронная операция завершается, функция может быть возобновлена ​​там, где она была приостановлена. Это делается неблокирующим образом, так что поток, из которого была вызвана возобновляемая функция, не будет заблокирован.

Мне не очевидно, в каком контексте (потоке) функция будет возобновлена. Будет ли он возобновлен потоком, из которого функция была приостановлена ​​(так это делается на С#, как я ее понимаю) или использует другой поток?

Если он возобновляется потоком, из которого он был приостановлен, должен ли поток быть помещен в какое-то особое состояние или будет ли этот планировщик обрабатывать?

4b9b3361

Ответ 1

Для цитаты из N3564:

После приостановки возобновляемая функция может быть возобновлена ​​логикой планирования среды выполнения и в конечном итоге завершит ее логику, после чего она выполнит оператор return (явный или неявный) и задает значение результата функции в заполнителе.

Следует отметить, что существует асимметрия между наблюдаемыми функциями извне (вызывающей) и внутренней: внешняя перспектива заключается в том, что функция возвращает значение будущего типа в первой точке подвески, тогда как внутренняя перспектива заключается в том, что функция возвращает значение типа T через оператор return, функции, возвращающие future/shared_future, все еще несколько отличающиеся.

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

Это по существу означает, что

  • При первом вызове возобновляемая функция выполняется в контексте потока своего вызывающего.
  • После каждой точки подвески реализация может свободно выбирать, в каком потоке продолжить выполнение возобновляемой функции
  • С точки зрения вызывающего кода возобновляемая функция работает как асинхронная функция, где часть (наблюдаемого) поведения надежно выполняется к моменту возврата вызова функции, но конечный результат может быть еще не выполнен ( return future<T> не должен находиться в состоянии готовности).
  • Как программист, вам не нужно прыгать через обручи, чтобы возобновить возобновляемую функцию.