条件变量 condition_variable:wait、wait_for、wait_until

参考:
https://www.apiref.com/cpp-zh/cpp/thread/condition_variable/wait.html
https://www.apiref.com/cpp-zh/cpp/thread/condition_variable/wait_for.html
https://www.apiref.com/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 则行为未定义。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JoannaJuanCV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值