这个问题的目的是了解期货在铁 rust 公司应该如何运作.我没有一段特定的代码不起作用,而是在理解必须如何编写期货以履行合同方面存在问题.
假设你在写《future 》.Poll()的约定允许调用者每次传递一个不同的Waker,而Future应该只调用最近的一个.
假设Future隐藏了由辅助线程在后台完成的实际工作.如果工作者还没有完成在创建Future时传递给它的工作,则Future应该返回挂起并克隆和存储Waker.然后,Future会在一段时间内不做任何事情,而必须调用Waker的是工作线程.这将导致future 再次被调查.
假设当再次轮询Future时,它确定工作线程到目前为止所做的工作还不够,因此它再次返回Pending,并克隆并存储它在第二次调用中获得的新Waker.
由于实际调用Waker的是工作线程,因此poll()实现必须在后台线程中更新Waker.然而,我并不清楚poll()实现如何在没有竞争条件的情况下做到这一点--但现在它变得棘手起来,因为细节在很大程度上依赖于poll()合同中的细节,我认为这个细节甚至没有具体指定.
一种可能发生的情况是,当poll()正在运行时,就在它想要将新的Waker交给后台Worker之前,Worker决定是时候调用Waker了.它现在调用oldWaker,尽管poll()已经收到了一个新的Waker,这可能会也可能不会违反合同(我认为这没有指定).因此,有人可能认为Worker可能会调用旧的Waker,直到Poll()完成,但只有当Worker被允许在Poll()运行时调用either Waker时才起作用,同样没有提到这一点,并且只需要在Poll()返回后调用新的Waker.
最后,即使这个假设也依赖于另一件未指定的事情:在多线程上下文中"After Poll()已返回"的确切含义,它通常必须求助于专门定义的术语,如发生之后,才能定义一件事接着一件事发生.
考虑到所有这些,poll()实现如何履行其合同,只调用最新的Waker呢?是否有一个文档指定了Poll()文档中似乎缺失的所有细节?