Ответ 1
Для цитаты из N3564:
После приостановки возобновляемая функция может быть возобновлена логикой планирования среды выполнения и в конечном итоге завершит ее логику, после чего она выполнит оператор return (явный или неявный) и задает значение результата функции в заполнителе.
Следует отметить, что существует асимметрия между наблюдаемыми функциями извне (вызывающей) и внутренней: внешняя перспектива заключается в том, что функция возвращает значение будущего типа в первой точке подвески, тогда как внутренняя перспектива заключается в том, что функция возвращает значение типа T через оператор return, функции, возвращающие future/shared_future, все еще несколько отличающиеся.
Возобновляемая функция может продолжить выполнение в другом потоке после возобновления после приостановки ее выполнения.
Это по существу означает, что
- При первом вызове возобновляемая функция выполняется в контексте потока своего вызывающего.
- После каждой точки подвески реализация может свободно выбирать, в каком потоке продолжить выполнение возобновляемой функции
- С точки зрения вызывающего кода возобновляемая функция работает как асинхронная функция, где часть (наблюдаемого) поведения надежно выполняется к моменту возврата вызова функции, но конечный результат может быть еще не выполнен ( return
future<T>
не должен находиться в состоянии готовности). - Как программист, вам не нужно прыгать через обручи, чтобы возобновить возобновляемую функцию.