Законно ли вызывать shared_future :: get () несколько раз для одного и того же экземпляра в одном и том же потоке? - PullRequest
8 голосов
/ 25 июня 2019

Я не могу найти ни прямого подтверждения, ни опровержения по этому вопросу.Кажется, что все ответы касаются аспекта «доступа из нескольких потоков», а не самого повторного доступа.

Определяет ли стандарт поведение для std::shared_future?А как насчет boost::shared_future?

Ответы [ 2 ]

12 голосов
/ 25 июня 2019

На одну ссылку в std::shared_future<T>::valid

В отличие от std :: future, общее состояние std :: shared_future не аннулируется при вызове get ().

Что имеет смысл. Если бы это было не так, то вы не могли бы, чтобы несколько потоков могли вызывать get. Мы можем дополнительно поддержать это, посмотрев на стандарт. В [futures.unique.future] / 15 они явно заявляют, что get работает только один раз с

освобождает любое общее состояние ([futures.state]).

в то время как в [futures.shared.future] / 18 он не утверждает ничего подобного, поэтому состояние остается в силе даже после вызова get.


boost::shared_future имеет такое же поведение. На ссылка get не имеет текста, заявляющего, что делает недействительным общее состояние при вызове на get, поэтому вы можете вызывать его несколько раз.

8 голосов
/ 25 июня 2019

AFAIK это законно. std::shared_future<T>::get() говорит :

Поведение не определено, если valid() равно false до вызова этого функция.

Переходя к std::shared_future<T>::valid() , он говорит :

Проверяет, относится ли будущее к общему состоянию.

...

В отличие от общего состояния std::future, std::shared_future не является становится недействительным, когда get() называется .

Что делает несколько get() вызовов из одного потока и в одном и том же экземпляре действительными.

...