C++ 承诺/未来:从函数返回哪个?

Posted

技术标签:

【中文标题】C++ 承诺/未来:从函数返回哪个?【英文标题】:C++ promise/future: Which to return from a function? 【发布时间】:2015-04-15 17:12:03 【问题描述】:

我有一个返回对 std::promise 的引用的函数:

std::shared_ptr<std::promise<void>> play();

(更多信息:该函数在某些设备上播放媒体,返回值表示播放完成的时间。如果第二次调用play,则在第一次返回的promise上设置一个值,并返回一个新的promise为第二次调用创建并返回)

然后调用者可以捕获该值并等待未来:

auto this_future = play()->get_future();
this_future.wait();

返回对 promise 的引用是否有意义,或者我应该返回未来,以便调用函数不必调用 get_future()?

【问题讨论】:

在 std::shared_ptr 中有一个 std::promise/std::future 可能是有问题的(它打破了 std::promise/std::future 的无复制概念) 同意;实际上需要 shared_ptr 来解决这些无副本问题,因为我想将它们存储在集合中并从函数中返回它们。但是,我看不出这会在哪里引起问题。 @ScottM:你也可以std::movefutures,如果你想存储在一个集合中,比如std::vector&lt;std::future&lt;T&gt;&gt; 你读懂了我的想法!我一直坐在这里想弄清楚是否可以修改第二个函数playAll() 以返回std::vector&lt;std::future&lt;void&gt;&gt; 而不是相应的promise 引用集合。 std::future 的无复制前提意味着只有一个消费者应该拥有它并认为他们有权从中获得.get()。使用std::shared_ptr&lt;std::future&lt;X&gt;&gt;,您的意思是“多个客户拥有此future 的同等所有权”。这是代码气味。同样,std::promise&lt;X&gt; 应该由数据的生产者唯一拥有:拥有两段共享所有权的代码意味着两者都有权设置其值(或读取其未来)。 play() 应该返回 std::future&lt;void&gt;。在内部可以保留std::promise&lt;void&gt; old_promise 【参考方案1】:

由于play() 的实现没有发布,我想说你很可能应该返回未来,并且该函数应该与承诺本身一起工作,很可能在不同的线程中。这种设计的基本原理是promise是生产者端,future是消费者端——所以函数会产生一个值,通过promise实例设置它,它将通过@987654322通知future结果已经到达@。

但是,请注意,您不必返回 std::shared_ptr&lt;std::future&lt;T&gt;&gt; — 只需 std::future&lt;T&gt; 就可以了。

【讨论】:

以上是关于C++ 承诺/未来:从函数返回哪个?的主要内容,如果未能解决你的问题,请参考以下文章

从异步函数返回的承诺中获取价值

对从异步函数返回的承诺感到非常困惑

Node.js 从函数返回一个承诺

从函数返回承诺

如何创建从回调函数返回承诺的函数[重复]

从 .map() 方法中的调度函数返回承诺