gpt4 book ai didi

c++ - 可恢复函数限制背后的基本原理

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:41 25 4
gpt4 key购买 nike

关于resumable functions的论文中,在有关限制的部分中列出了三个限制:

  • Resumable functions cannot use a variable number of arguments. For situations where varargs are necessary,the argument unwrapping may be placed in a function that calls a resumable function after doing the unwrapping of arguments.
  • The return type of a resumable function must be future<T> or shared_future<T>. The restrictions on T are defined by std::future, not this proposal, but T must be a copyable or movable type, or ‘void’. It must also be possible to construct a variable of T without an argument; that is, it has to have an accessible (implicit or explicit) default constructor if it is of a class type.
  • Await expressions may not appear within the body of an exception handler and should not be executed while a lock on any kind is being held by the executing thread.

此限制背后一定有一个原因,由于我缺乏并发知识,我无法推断出是什么原因。有人可以启发我这个话题吗?

可变数量的参数

这个限制是指 C 风格的可变参数函数还是 C++11 可变参数模板函数?

  • 如果是 C 风格的,限制的原因与 va_* 所做的魔术有关。宏?
  • 如果指的是可变模板函数,我假设限制必须与参数包的解包有关,而不是与函数是模板函数的事实有关(没有关于模板可恢复函数的措辞,所以我假设他们是合法的)。

在这两种情况下,我认为编译器可以足够聪明地推断出要使用哪个函数。

默认可构造和可复制/可移动类型

我了解返回 std::future 的原因或 std::shared_future ,但我猜测可用类型背后的限制原因与 future 可以使用的类型有关。

因此,该论文提议使用两个新关键字(resumable 和 await)来扩展该语言,这两个关键字提供可恢复函数的行为,但最终它依赖于现有的结构来在函数和函数之间传输可恢复函数的返回值来电者。

为什么不也为返回值提出某种语言扩展呢?这可以(也许)释放对默认可构造和可复制/可移动类型的限制,并修复返回类型和返回类型之间的关联:

It should thus be noted that there is an asymmetry between the function’s observed behavior from the outside (caller) and the inside: the outside perspective is that function returns a value of type future<T> at the first suspension point, while the inside perspective is that the function returns a value of type T via a return statement (...)

没有可等待的异常处理程序,也没有可等待的锁定线程

我想在捕获异常的同时等待某些东西是没有意义的,但我对锁定线程的限制一无所知。

最佳答案

我很确定所有这些限制都与必须“保存”和“恢复”可恢复函数的上下文这一事实有关——我希望该机制将创建一个临时的“堆栈拷贝”或相似的东西。所以:

  • 可变数量的参数

    这实际上意味着使用 va_arg 功能 - 不是因为涉及宏,而是因为外部代理不可能知道实际参数的数量 - 对于 printf,您必须阅读格式字符串,对于其他一些格式字符串,最后一个标记为 NULL。那么需要保存多少上下文呢?

  • 锁定线程

    所以我们刚刚说“我们不希望这个线程被打断”,然后我们说“现在让我们运行其他东西”。这就像在走进浴缸时说“拜托,在任何情况下我洗澡的时候都不能被打扰”,同时说“你能在 2 分钟后给我打电话吗......” - 假设洗澡需要超过 2分钟,其中一个将是不真实的。

  • 默认可构造

    我很确定这里的逻辑是,如果要构造的返回值必须将参数传递给构造函数,这会使整个概念变得非常复杂。你甚至会如何描述这样的事情?在暂停状态下,您还必须“坚持”这些论点。同样,使上下文的保存更加复杂。

关于c++ - 可恢复函数限制背后的基本原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23422889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com