c++ - 从多个线程多次调用 std::future 上的 wait() 是否安全?

标签 c++ multithreading c++11

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

我想等待这个future(使用wait()wait_for()wait_until()) 来自多个线程。我还希望在调用 promise::set_value() 之后调用 wait() 以立即返回。

来自 http://www.cplusplus.com/reference/future/future/wait/

Calling this member function on a future object that is not valid, produces undefined behavior

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

最佳答案

Getting a future from a promise starts it off with valid()==true. As far as I can see only future::get() sets valid() back to false. Is this assumption correct?

它也可以通过移动分配一个无效的 future 而变得无效,或者通过移动 future 使其共享状态转移到不同的对象。也不能只是等待就失效了。

Can I call the wait() family of functions as often as I want?

是的。

Will calls to wait() after the promise's value has been set return immediately?

是的(它可能涉及锁定互斥锁或自旋锁以检查状态是否准备好,然后返回,因此可能需要等待一小段时间来获取锁)

Can I call them from multiple threads?

是的。

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

关于c++ - 从多个线程多次调用 std::future 上的 wait() 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27078362/

相关文章:

c++ - 在 Form.h 之外更改表单标签文本

c++ - 在 C++ 中用 new/delete 替换 malloc/free

c++ - 我可以在编译时检测到 "function arguments"是编译时常量吗

java - 使用 JNI 从 native 方法返回 null

c# - 如何调试死锁?

java - JVM 线程调度程序如何控制多处理器的线程?

c# - 防止多线程中的不良优化

c++ - sizeof... 是否允许在模板参数中用于特化?

c++ - std::move 如何应用于函数返回值?

c++ - 用 `auto` 初始化需要复制构造函数?