我正在尝试确定何时可以安全地在 std::future
和 std::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
获得 future
以 valid()==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/