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

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

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

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

19

Решение

Цитировать из N3564:

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

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

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

По сути это означает, что

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]