在std :: future上多次调用wait()并从多个线程安全吗?

时间:2014-11-22 14:16:37

标签: c++ multithreading c++11

我正在尝试确定何时可以在wait()std::future上安全地拨打std::shared_future。我从未在get()上致电future,并且future已通过调用其相应承诺的set_value()方法而准备就绪。

我想在多个帖子中等待future(使用wait()wait_for()wait_until())。我还希望在wait()被调用后立即回复promise::set_value()

来自http://www.cplusplus.com/reference/future/future/wait/

  

在未来的无效对象上调用此成员函数会产生未定义的行为

future获取promisevalid()==true启动它。据我所知,只有future::get()valid()设置为假。这个假设是否正确?我可以随时调用wait()系列函数吗?在设置了promise的值之后调用wait()会立即返回吗?我可以从多个线程中调用它们吗?

2 个答案:

答案 0 :(得分:14)

  

从承诺中获取未来会以valid()== true开始。据我所知,只有future :: get()将valid()设置为false。这个假设是否正确?

通过移动 - 为其分配无效的未来,或通过移动未来使其共享状态转移到其他对象,它也可能变得无效。它只是等待才能变得无效。

  

我可以随意调用wait()系列函数吗?

  

在设置了promise的值之后调用wait()会立即返回吗?

是(可能涉及锁定互斥锁或自旋锁以检查状态是否准备就绪,然后返回,因此可能需要等待一小段时间才能获得锁定)

  

我可以从多个线程调用它们吗?

wait()是一个const成员函数,因此要求库确保可以在多个线程的单个future对象上调用它,而无需任何用户提供的同步。

答案 1 :(得分:2)

从多个线程访问单个future可能会导致数据争用和未定义的行为,如果其中至少有一个可以执行get()并且没有正确的同步可以避免这种情况。

因此,如果您需要从多个线程访问future,您最好考虑shared_future"They also allow the value in the shared state to be retrieved multiple times once ready."只要每个线程使用共享的未来访问它们,它们就是线程安全的它自己的shared_future对象。

备注: 我的回答是假设在某个时候可能会发生get(),因为未明确提及承诺promise<void>