如何手动创建将在析构函数中阻塞的Future

时间:2018-11-27 08:30:59

标签: c++ future

我已经读过http://scottmeyers.blogspot.com/2013/03/stdfutures-from-stdasync-arent-special.html,但没有显示一个示例来说明如何实现相同的行为-例如,将来将在析构函数中进行阻塞,与从异步返回的相同,但不使用任何行为异步。

能否请您举一个这样的例子?谢谢!

2 个答案:

答案 0 :(得分:1)

如果您遵循该文章下方的评论主题,则会看到其他专家不同意:

  • 不是future的{​​{1}}应该阻塞析构函数。

  • Scott Meyers对标准的解释是事实。

Martinho Fernandes:

  

我不明白为什么这是所有期货的要求:您引用的此特定要求来自async的要求,而不是std::async的要求。std::future的析构函数的唯一要求是它“释放共享状态”。碰巧来自std::future的共享状态会添加您引用的要求,但标准库中没有其他共享状态具有此要求。

草药师:

  

tl; dr:Martinjo已经正确回答了该问题–该文章不正确,冻结仅适用于具有启动政策std::async的{​​{1}}返回的期货。

     
    

斯科特说:     在30.6.8 / 5中,我们看到[...]这是任何将来对象的要求,而不仅仅是std::async调用返回的对象。

  
     

这不遵循。 30.6.8是launch::async的规范。 其中的所有内容仅针对std::async

     

但是,正如Martinho已经正确说过的那样,此例外仅在第30.6.8节“功能模板异步”中出现,并且一般不适用于期货。

结论:我认为您无法找到所需的示例。

答案 1 :(得分:0)

很抱歉回答自己,但只是为了确认已回答问题:根据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(); }

从异步返回的未来恰好使用这种确切的状态。通过创建一个析构函数将在某个线程上进行join()的类并使用该类作为模板参数来创建Future,可以实现相同的行为:https://ideone.com/5RAPoA