C++ promise/future:从函数中返回哪个?

15

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

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

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

调用者可以捕获该值并等待未来的到来:

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

将 Promise 的引用返回,还是应该返回 Future,这样调用函数就不必调用 get_future()?


在std::shared_ptr中拥有std::promise/std::future可能是值得质疑的(它会破坏std::promise/std::future的无复制概念)。 - user2249683
同意;实际上需要 shared_ptr 来解决这些不允许复制的问题,因为我想把它们存储在集合中并从函数中返回。然而,我看不出这会引起什么问题。 - Scott M
1
@ScottM:如果你想将它们存储在集合中,比如std::vector<std::future<T>>,你也可以使用std::move来移动 futures。 - Nawaz
2
std::future 的无复制前提意味着只有一个消费者应该拥有它并认为他们有权从中获取 .get()。使用 std::shared_ptr<std::future<X>>,你在说“多个客户端拥有这个future的平等所有权”。这是代码异味。同样,std::promise<X> 应该由数据的生产者唯一拥有:拥有共享所有权的两个代码片段意味着两者都有权设置其值(或读取其未来)。play() 应该返回 std::future<void>。内部可以保留一个 std::promise<void> old_promise - Yakk - Adam Nevraumont
抱歉 - 我故意宽泛地使用“引用”一词,指的是“指向std::promise对象的对象”,因为我不想陷入“什么类型的引用”(promise&,promise*或某种智能指针)的争论中 - 我想集中讨论是公开std::future对象还是(某种形式的)std::promise引用。 - Scott M
显示剩余3条评论
1个回答

13
自从play()的实现没有发布,我认为你应该返回未来对象并使函数与承诺本身一起工作,很可能在不同的线程中。这种设计的基础是 promise 是生产者端,future 是消费者端,所以该函数会生成一个值,并通过 promise 实例设置它,后者将通过 get 通知 future 结果已经到达。
但是请注意,您不必返回 std::shared_ptr<std::future<T>>,只返回 std::future<T> 就可以了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接