【发布时间】: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<std::future<T>>。 -
你读懂了我的想法!我一直坐在这里想弄清楚是否可以修改第二个函数
playAll()以返回std::vector<std::future<void>>而不是相应的promise 引用集合。 -
std::future的无复制前提意味着只有一个消费者应该拥有它并认为他们有权从中获得.get()。使用std::shared_ptr<std::future<X>>,您的意思是“多个客户拥有此future的同等所有权”。这是代码气味。同样,std::promise<X>应该由数据的生产者唯一拥有:拥有两段共享所有权的代码意味着两者都有权设置其值(或读取其未来)。play()应该返回std::future<void>。在内部可以保留std::promise<void> old_promise。