【发布时间】:2014-05-02 07:23:09
【问题描述】:
在关于resumable functions的论文中,在限制部分列出了三个限制:
- 可恢复函数不能使用可变数量的参数。对于需要可变参数的情况,可以将参数解包放在一个函数中,该函数在对参数进行解包后调用可恢复函数。
- 可恢复函数的返回类型必须是
future<T>或shared_future<T>。 T 的限制是由std::future定义的,不是本提案,但T必须是可复制或可移动的类型,或“void”。还必须可以构造一个不带参数的T变量;也就是说,如果它是类类型,它必须有一个可访问的(隐式或显式)默认构造函数。- 等待表达式可能不会出现在异常处理程序的主体中,并且不应在执行线程持有任何类型的锁时执行。
这种限制背后一定有原因,由于我对并发性缺乏了解,我无法推断出原因是什么。有人可以启发我这个话题吗?
可变数量的参数
这个限制是指 C 风格的可变参数函数还是 C++11 可变参数模板的?
- 如果是C风格的,限制的原因与
va_*宏所做的魔术有关? - 如果指的是可变参数模板函数,我假设限制必须与参数包的解包有关,而不是函数是模板的事实(没有关于模板可恢复函数的措辞,所以我假设它们是合法的)。
在这两种情况下,我都认为编译器可以足够聪明地推断出要使用的函数。
默认可构造和可复制/可移动类型
我理解返回 std::future 或 std::shared_future 背后的原因,但我猜测可用类型背后的限制原因与期货可以使用的类型有关。
因此,该论文提议使用两个新关键字(resumable 和 await)扩展该语言,这些关键字提供可恢复函数的行为,但最终它信任现有的构造来在函数和函数之间传输可恢复函数的返回值调用者。
为什么不也为返回值提出某种语言扩展?这可以(也许)释放对默认可构造和可复制/可移动类型的限制,并修复返回类型和返回类型之间的 assimetry:
因此应该注意,从外部(调用者)和内部观察到的函数行为之间存在不对称:从外部角度来看,函数在第一个暂停点返回
future<T>类型的值,而内部观点是该函数通过 return 语句返回T类型的值 (...)
没有可等待的异常处理程序,也没有可等待的锁定线程
我想在捕获异常的同时等待某些东西是没有意义的,但我对锁定线程的限制一无所知。
【问题讨论】: