在 std::future 上多次从多个线程调用 wait() 是否安全

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

本文关键字:wait 调用 安全 是否 线程 future std      更新时间:2023-10-16

我正在尝试确定何时可以安全地在std::futurestd::shared_future上呼叫wait()。我从不调用get() future,并且future从调用到其相应 promise 的 set_value() 方法都准备好了。

我想等待来自多个线程的这个future(使用 wait()wait_for()wait_until())。我还想在promise::set_value()被叫到后立即打电话给wait()

从 http://www.cplusplus.com/reference/future/future/wait/

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

promise获得futurevalid()==true开始。据我所知,只有future::get()valid()回到假。这个假设正确吗?我可以根据需要随时调用wait()函数族吗?设置承诺值后,对wait()的调用会立即返回吗?我可以从多个线程调用它们吗?

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

它也可以通过移动分配无效的未来来变得无效,或者通过移动未来使其共享状态转移到其他对象。不过,它不能仅仅通过等待而变得无效。

我可以随心所欲地调用 wait() 系列函数吗?

是的。

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

是(它可能涉及锁定互斥锁或自旋锁以检查状态是否准备就绪,然后返回,因此可能需要稍等片刻才能获取锁)

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

是的。

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

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

因此,如果您需要从多个线程访问future,则最好考虑shared_future:"它们还允许在准备就绪后多次检索共享状态的值。只要每个线程使用自己的shared_future对象访问共享的未来,它们就是线程安全的。

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