Как вручную создать будущее, которое будет блокировать в деструкторе - PullRequest
0 голосов
/ 27 ноября 2018

Я прочитал http://scottmeyers.blogspot.com/2013/03/stdfutures-from-stdasync-arent-special.html, но он не показывает пример того, как можно реализовать такое же поведение - то есть будущее, которое будет блокировать в деструкторе то же, что и возвращенное из асинхронного режима, но без использованиялюбой асинхронный.

Можете ли вы привести такой пример?Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Извините, что отвечаю сам, но только для того, чтобы подтвердить, что на вопрос дан ответ: согласно https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-api-4.5/a00879_source.html действительно деструктор общего состояния блокирует не само будущее.

  template<typename _Res>
     class __future_base::_Async_state : public __future_base::_State
     {
     public:
       typedef _Res _Res_type;

       explicit 
       _Async_state(std::function<_Res()>&& __fn)
       : _M_result(new _Result<_Res>()), _M_fn(std::move(__fn)),
     _M_thread(mem_fn(&_Async_state::_M_do_run), this)
       { }

       ~_Async_state() { _M_thread.join(); }

И будущее, возвращаемое из асинхронного режима, использует именно этот тип состояния.Такое же поведение может быть достигнуто путем создания класса, деструктор которого присоединится к () в каком-либо потоке, и создания будущего с этим классом в качестве параметра шаблона: https://ideone.com/5RAPoA

0 голосов
/ 27 ноября 2018

Если вы будете следовать ветке комментариев под этой статьей, вы увидите, что другие эксперты не согласны:

  • То, что future s, которые не из async, должны блокироваться вдеструктор.

  • С толкованием Скоттом Мейерсом стандарта, который должен иметь место.

Мартиньо Фернандес:

Я не понимаю, почему это требование для всех фьючерсов: это конкретное требование, которое вы цитируете, основано на требованиях к std::async, а не на std::future. Единственном требовании к деструктору std::future заключается в том, что оно «освобождает общее состояние».Бывает, что общее состояние из std::async добавляет требование, которое вы цитируете, но ни одно другое общее состояние в стандартной библиотеке не имеет такого требования.

Херб Саттер:

tl; dr: Martinjo уже ответил на этот вопрос правильно - статья не верная, блокировка применяется только к фьючерсам, возвращенным с std::async с политикой запуска launch::async.

Скотт сказал: и в30.6.8 / 5, мы видим, что [...] Это требование для любого будущего объекта, а не только для тех, которые были возвращены из вызовов std::async.

Это не следует.30.6.8 является спецификацией std::async. Все, что там сказано, относится к std::async.

Но, как уже правильно сказал Мартиньо, это исключение содержится в пункте 30.6.8 «Только шаблон функции асинхронный», и делаетне относится к фьючерсам в целом.

Вывод: Не думаю, что вы сможете найти искомый пример.

...