我正在尝试确定何时可以在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
获取promise
以valid()==true
启动它。据我所知,只有future::get()
将valid()
设置为假。这个假设是否正确?我可以随时调用wait()
系列函数吗?在设置了promise的值之后调用wait()
会立即返回吗?我可以从多个线程中调用它们吗?
答案 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>