Одним из предложений для C ++ 14 является Возобновляемые функции который дает C ++ то, что доступно в C # сегодня с помощью механизмов асинхронного / ожидающего. Основная идея заключается в том, что функция может быть приостановлена
в ожидании завершения асинхронной операции. Когда асинхронная операция завершается, функция может быть возобновлена там, где она была приостановлена. Это делается неблокирующим образом, чтобы поток, из которого была вызвана возобновляемая функция, не был заблокирован.
Мне не очевидно, в каком контексте (потоке) функция будет возобновлена. Будет ли он возобновлен потоком, из которого была приостановлена функция (это, как я понимаю, в C #) или использует другой поток?
Если он возобновляется потоком, из которого он был приостановлен, должен ли он быть переведен в какое-то специальное состояние или планировщик справится с этим?
Цитировать из N3564:
После приостановки возобновляемая функция может быть возобновлена логикой планирования среды выполнения и в конечном итоге завершит свою логику, после чего она выполнит оператор возврата (явный или неявный) и установит значение результата функции в заполнителе.
Таким образом, следует отметить, что существует асимметрия между наблюдаемым поведением функции извне (вызывающая сторона) и изнутри: внешняя перспектива — это то, что функция возвращает значение типа future в первой точке приостановки, тогда как внутренняя перспектива — это то, что Функция возвращает значение типа T через оператор return, функции, возвращающие future / shared_future, ведут себя несколько иначе.
Возобновляемая функция может продолжить выполнение в другом потоке после возобновления после приостановки ее выполнения.
По сути это означает, что
future<T>
не должен быть в состоянии готовности).Других решений пока нет …