我已经读过http://scottmeyers.blogspot.com/2013/03/stdfutures-from-stdasync-arent-special.html,但没有显示一个示例来说明如何实现相同的行为-例如,将来将在析构函数中进行阻塞,与从异步返回的相同,但不使用任何行为异步。
能否请您举一个这样的例子?谢谢!
答案 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