我试图确定何时可以安全地拨打wait()
std::future
和std::shared_future
。我从来没有拨打get()
上的future
,并且future
已经准备好从对其承诺的相应承诺set_value()
方法。在std :: future上多次调用wait()并从多个线程安全地调用?
我想等这个future
(使用wait()
,wait_for()
,wait_until()
)从多个线程。在promise::set_value()
已被呼叫立即返回之后,我也希望拨打wait()
。
从http://www.cplusplus.com/reference/future/future/wait/
调用未来的对象是无效的,在这个成员函数产生不确定的行为
获取从promise
一个future
与valid()==true
开始其关闭。据我所见,只有future::get()
集valid()
回到假。这个假设是否正确?我可以根据需要经常拨打wait()
系列功能吗?诺言的价值设定后,将立即拨打wait()
立即返回?我可以从多个线程调用它们吗?
我不确定简单地做一个函数'const'保证它*线程安全*。规范提到这是一个要求吗? – Galik 2014-11-22 14:51:30
我不喜欢使用“线程安全”这个词,因为它对不同的人意味着不同的事情。 17.6.5.9 [res.on.data.races]表示标准库必须确保在一个对象上调用(仅)'const'成员函数不会引入数据竞争。如果对象具有与其他对象共享的状态(如'将来'那样),则库必须提供其自己的同步以防止竞赛。这并不意味着简单地添加'const'就是提供线程安全的magic pixie dust,这意味着库有时需要做额外的工作来为'const'函数提供保证。 – 2014-11-22 14:52:10
简单的事实,'wait()'是'const'只是保证函数不会修改对象的状态。然而,它并不保证结果与其他线程所做的更改保持一致/同步。 – Christophe 2014-11-22 15:05:34