在什么情况下可恢复函数在C++ 14中执行?

Tob*_*olm 19 c++ asynchronous future c++14

C++ 14的提议之一是Resumable Functions,它为C++提供了当前使用async/await机制的C#.基本思想是在等待异步操作完成时可以暂停一个函数.当异步操作完成时,可以在暂停的位置恢复该功能.这是以非阻塞方式完成的,因此不会阻止调用可恢复函数的线程.

我不清楚函数将在哪个上下文(线程)中恢复.它会被暂停函数的线程恢复(这是我在C#中完成的方式),还是使用另一个线程?

如果它被暂停的线程恢复,那么线程是否必须处于某种特殊状态,或者调度程序是否会处理它?

Bar*_*nau 4

引用 N3564 的话:

\n\n
\n

挂起后,可恢复函数可能会被运行时的调度逻辑恢复,并最终完成其逻辑,此时它执行 return 语句(显式或隐式)并将 function\xe2\x80\x99s 结果值设置为占位符。

\n\n

因此应该注意的是,函数\xe2\x80\x99从外部(调用者)和内部观察到的行为之间存在不对称性:外部视角是函数在第一个挂起点返回一个 future 类型的值,而内部观点是该函数通过 return 语句返回 T 类型的值,返回 future/shared_future 的函数的行为仍然有些不同。

\n\n

可恢复函数可以在暂停执行后恢复后继续在另一个线程上执行。

\n
\n\n

这本质上意味着

\n\n
    \n
  • 首次调用时,可恢复函数在其调用者的线程上下文中执行。
  • \n
  • 在每个挂起点之后,实现可以自由选择在哪个线程上继续执行可恢复函数
  • \n
  • 从调用代码的角度来看,可恢复函数的工作方式类似于异步函数,其中部分(可观察的)行为在函数调用返回时可靠地执行,但最终结果可能尚未出现(返回的future<T>不必须处于就绪状态)。
  • \n
  • 作为一名程序员,您不必费力去获取可恢复的函数。
  • \n
\n