20

C++14 的提议之一是Resumable Functions,它为 C++ 提供了当今 C# 中可用的异步/等待机制。基本思想是可以在等待异步操作完成时暂停函数。当异步操作完成时,函数可以在暂停的地方恢复。这是以非阻塞方式完成的,因此调用可恢复函数的线程不会被阻塞。

对我来说,函数将在哪个上下文(线程)中恢复并不明显。它会由暂停函数的线程恢复(据我了解,这是在 C# 中完成的)还是使用另一个线程?

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

4

1 回答 1

4

引用 N3564:

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

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

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

这实质上意味着

  • 首次调用时,可恢复函数在其调用者的线程上下文中执行。
  • 在每个暂停点之后,实现可以自由选择在哪个线程上继续执行可恢复函数
  • 从调用代码的角度来看,可恢复函数的工作方式类似于异步函数,其中部分(可观察的)行为在函数调用返回时可靠地执行,但最终结果可能尚未出现(返回future<T>的不是必须处于就绪状态)。
  • 作为程序员,您不必为了恢复可恢复的功能而费尽心思。
于 2013-06-19T10:12:34.627 回答