繁体   English   中英

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

[英]Is calling wait() on a std::future multiple times and from multiple threads safe?

我正在尝试确定何时可以在std::futurestd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM