admin管理员组文章数量:1599408
参考:
https://www.apiref/cpp-zh/cpp/thread/condition_variable/wait.html
https://www.apiref/cpp-zh/cpp/thread/condition_variable/wait_for.html
https://www.apiref/cpp-zh/cpp/thread/condition_variable/wait_until.html
std::condition_variable::wait
wait:等待结果变得可用;
当 std::condition_variable 对象的某个 wait 函数被调用的时候,它使用 std::unique_lock(通过 std::mutex) 来锁住当前线程。当前线程会一直被阻塞,直到另外一个线程在相同的 std::condition_variable 对象上调用了 notification 函数来唤醒当前线程。
函数
void wait( std::unique_lock<std::mutex>& lock );
原子地解锁 lock ,阻塞当前执行线程,并将它添加到于 *this 上等待的线程列表。线程将在执行 notify_all() 或 notify_one() 时被解除阻塞。解阻塞时,无关乎原因, lock 再次锁定且 wait 退出。若此函数通过异常退出,则亦会重获得 lock ;
函数1:
template< class Predicate >
void wait( std::unique_lock<std::mutex>& lock, Predicate pred );
等价于
while (!pred()) {
wait(lock);
}
此重载可用于在等待特定条件成为 true 时忽略虚假唤醒。注意进入此方法前,必须得到 lock , wait(lock) 退出后也会重获得它,即能以 lock 为对 pred() 访问的保障。
若这些函数不能满足后置条件( lock.owns_lock() == true 且调用方线程锁定 lock.mutex() ),则调用 std::terminate 。例如,这可能在重锁定互斥抛异常的情况下发生。
参数
lock - std::unique_lockstd::mutex 类型对象,必须为当前线程所锁定
pred - 等待是否应该持续则返回 false 的谓词。
谓词函数的签名应等价于如下者:
bool pred();
wait_for
等待结果,如果在指定的超时间隔后仍然无法得到结果,则返回。
wait_for与 std::condition_variable::wait() 类似,不过 wait_for 可以指定一个时间段,在当前线程收到通知或者指定的时间 rel_time 超时之前,该线程都会处于阻塞状态。而一旦超时或者收到了其他线程的通知,wait_for 返回,剩下的处理步骤和 wait() 类似。
函数:
template< class Rep, class Period >
std::cv_status wait_for( std::unique_lock<std::mutex>& lock,
const std::chrono::duration<Rep, Period>& rel_time);
原子地释放 lock ,阻塞当前线程,并将它添加到等待在 *this 上的线程列表。线程将在执行 notify_all() 或 notify_one() 时,或度过相对时限 rel_time 时被解除阻塞。它亦可被虚假地解除阻塞。解阻塞时,无关缘由,重获得 lock 并退出 wait_for() 退出。若此函数通过异常退出,则亦重获得 lock 。
template< class Rep, class Period, class Predicate >
bool wait_for( std::unique_lock<std::mutex>& lock,
const std::chrono::duration<Rep, Period>& rel_time,
Predicate pred);
等价于
return wait_until(lock, std::chrono::steady_clock::now() + rel_time, std::move(pred));
此重载可用于忽略虚假唤醒。
用稳定时钟度量时长。由于调度或资源争议,此函数可能阻塞长于 timeout_duration 。
wait_until
阻塞当前线程,直到条件变量被唤醒,或直到抵达指定时间点;
函数
template< class Clock, class Duration >
std::future_status wait_until( const std::chrono::time_point<Clock,Duration>& timeout_time ) const;
wait_until 等待结果变为可用。它阻塞直至抵达指定的 timeout_time ,或结果变为可用,两者的先到来者。返回值指示 wait_until 为何返回。
若调用此函数前 valid() == false 则行为未定义。
本文标签: 变量条件conditionvariablewaituntilwaitfor
版权声明:本文标题:条件变量 condition_variable:wait、wait_for、wait_until 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728322290a1153982.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论