在 std::future 上多次从多个线程调用 wait() 是否安全
Is calling wait() on a std::future multiple times and from multiple threads safe?
我正在尝试确定何时可以安全地在std::future
和std::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
获得future
从valid()==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>
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- std::condition_variable::wait()如何评估给定的谓词
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- 如何在Wait()C++期间同时调用另一个函数
- 对boost::condition_variable::wait的调用没有匹配的函数
- 当应用程序在没有适当的 wait() 调用的情况下关闭时,QThread 会发生什么
- 如果我调用 wait 通知的条件变量会发生什么
- 在 std::future 上多次从多个线程调用 wait() 是否安全
- std::future::wait 应该使用这么多 CPU 吗?是否有性能更高的调用
- C++-在代码块中使用系统调用(fork、exec、wait等)
- fork and wait系统调用出现问题