在同一线程中的同一实例上多次调用shared_future :: get()是否合法?

时间:2019-06-25 14:15:14

标签: c++ boost future

我对此事既没有直接确认也没有反驳。所有答案似乎都是针对“从多个线程进行访问”方面的问题,而不是针对重复访问本身。

标准是否定义了std::shared_future的行为? boost::shared_future呢?

2 个答案:

答案 0 :(得分:12)

std::shared_future<T>::valid中的每次点击首选项

  

与std :: future不同,调用get()时std :: shared_future的共享状态不会无效。

有道理。如果不是这种情况,那么您将不能有多个线程可以调用get。我们可以通过查看标准来进一步支持这一点。在[futures.unique.future]/15中,他们明确声明get仅在以下情况下起作用

  

释放任何共享状态([futures.state])。

[futures.shared.future]/18中,它没有声明这种情况,因此在调用get之后,该状态仍然有效。


boost::shared_future具有相同的行为。每个the reference get都没有文字说明在调用get时共享状态无效,因此您可以多次调用它。

答案 1 :(得分:8)

AFAIK,这是合法的。 std::shared_future<T>::get() says

  

如果valid()false,则在调用此行为之前,其行为是不确定的   功能。

转到std::shared_future<T>::valid() it says

  

检查未来是否指向共享状态。

     

...

     

std::future不同, std::shared_future的共享状态不是   调用get()时无效

这将使来自同一线程且在同一实例上的多个get()调用有效。