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

vin*_*nes 8 c++ boost future

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

该标准是否定义了行为std::shared_future?那boost::shared_future

Nat*_*ica 12

每个cppreference中 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具有相同的行为。每个引用 get都没有文字说明它使对的共享状态无效,get因此您可以多次调用它。


Som*_*ken 8

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

如果该行为是不确定的valid()false在调用此函数之前。

转到std::shared_future<T>::valid() 它说

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

...

不同于std::futurestd::shared_futureget()被调用时,其共享状态不会无效

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