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

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

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

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


person Tobias Furuholm    schedule 02.06.2013    source источник
comment
Понятия не имею, о чем вы спрашивали, но если функция возобновления неблокирующая, то предположительно она возвращает какое-то std::optional и получатель должен проверить, был ли доступен результат или нет. Похоже, вы уже можете писать такой код с текущей механикой std::future...?   -  person Kerrek SB    schedule 02.06.2013
comment
Я не думаю, что это предложение было принято.   -  person chris    schedule 02.06.2013
comment
@Karrek SB: Предложение связано, если вы хотите прочитать об этом. Вы правы в том, что для достижения того же результата можно использовать фьючерсы (как правило, с предложенным future.then). В предложении подробно описано, чем оно отличается от прямого использования фьючерсов и почему это было бы хорошей идеей.   -  person Tobias Furuholm    schedule 02.06.2013
comment
Разве раздел 3.2 Реализация: Кадры активации, размещенные в куче, не предоставляет некоторую информацию, которую вы ищете? Это начинается с - ... этот дизайн имеет то преимущество, что он довольно прост, а также похож на реализацию, на которую C # полагается для поддержки асинхронных методов.   -  person SChepurin    schedule 02.06.2013
comment
N3564 не занимается никаким планированием; он просто оставляет это до будущей реализации (ключевой раздел — 3.2.6). Предположительно, если N3564 будет серьезно принят, они добавят какую-то функцию ConfigureAwait, чтобы указать, какой Executor будет использоваться в будущем.   -  person Stephen Cleary    schedule 02.06.2013
comment
@chris: В Бристоле это не обсуждалось ни CWG, ни EWG. Что практически означает, что это не C++14, но будет обработано для C++17.   -  person Balog Pal    schedule 02.06.2013


Ответы (1)


Цитата из N3564:

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

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

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

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

  • При первом вызове возобновляемая функция выполняется в контексте потока вызывающего ее объекта.
  • После каждой точки приостановки реализация может свободно выбирать, в каком потоке продолжить выполнение возобновляемой функции.
  • С точки зрения вызывающего кода возобновляемая функция работает как асинхронная функция, в которой часть (наблюдаемого) поведения надежно выполняется к моменту возврата вызова функции, но окончательный результат может быть еще не получен (возвращенный future<T> выполняет не должен быть в состоянии готовности).
  • Как программист, вам не нужно прыгать через обручи, чтобы возобновить возобновляемую функцию.
person Bart van Ingen Schenau    schedule 19.06.2013
comment
Посмотрите некоторые из них в действии здесь: blogs.msdn.com/b/vcblog/archive/2013/12/20/ - person Raman Sharma; 30.01.2014
comment
и многое другое здесь blogs.msdn .com/b/vcblog/archive/2014/11/12/ - person Raman Sharma; 14.11.2014