![](/img/trans.png)
[英]std::future or std::shared_future to wait for multiple threads
[英]Is calling wait() on a std::future multiple times and from multiple threads safe?
我正在尝试确定何时可以在std::future
和std::shared_future
上安全地调用wait()
。 我从未在future
调用get()
,并且通过调用相应的promise的set_value()
方法来设置future
。
我想等待这个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()
设置为false。 这个假设是否正确? 我可以随意调用wait()
系列函数吗? 在设置了promise的值之后调用wait()
会立即返回吗? 我可以从多个线程调用它们吗?
从承诺中获得未来会以valid()== true开始。 据我所知,只有future :: get()将valid()设置为false。 这个假设是否正确?
它也可能通过移动 - 为其分配无效的未来,或通过移动未来使其共享状态转移到其他对象而变为无效。 虽然等待它不会变得无效。
我可以随意调用wait()系列函数吗?
是。
在设置了promise的值之后调用wait()会立即返回吗?
是(可能涉及锁定互斥锁或自旋锁以检查状态是否准备好,然后返回,因此可能需要等待一小段时间来获取锁)
我可以从多个线程调用它们吗?
是。
wait()
是一个const成员函数,因此需要库来确保它可以在多个线程的单个future对象上调用,而无需任何用户提供的同步。
从多个线程访问单个future
可能会导致数据争用和未定义的行为,如果其中至少有一个可以执行get()
并且没有适当的同步可以避免这种情况。
因此,如果您需要从多个线程访问future
,您最好考虑使用shared_future
: “它们还允许在准备好后多次检索共享状态中的值。” 只要每个线程使用自己的shared_future
对象访问共享的未来,它们就是线程安全的。
备注: 我的回答是假设在某个时候可能会发生get(),因为未明确提到promise<void>
是promise<void>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.