std::condition_variable::wait_until是C++标准库中的一个函数,用于在多线程编程中实现线程的等待和唤醒操作。它的工作原理如下: 1. 当一个线程需要等待某个条件满足...
wait_until导致当前线程阻塞,直到通知条件变量、到达特定时间或发生虚假唤醒为止,还可以选择循环直到满足某个谓词。 1%29原子释放lock,阻止当前正在执行的线程,并将其添加到等待执行的线程列表中。*this.线程将在notify_all()或notify_one()被执行,或者当绝对时间点被执行时。timeout_time到达了。它也可能是伪造的。
if(wait_until(lock, abs_time)==std::cv_status::timeout) returnpred(); returntrue;。 此重载可用于在等待特定条件变为真的过程中忽略虚假唤醒。 在wait_until返回时,lock.owns_lock()是true,并且调用线程会锁定lock.mutex()。如果无法满足这些后条件[1],那么就会调用std::terminate。
if(wait_until(lock, abs_time)==std::cv_status::timeout) returnpred(); } returnpred();。 在wait_until返回时,调用线程会锁定lock。如果无法满足此后条件[1],那么就会调用std::terminate。 ↑重新锁定互斥体的过程中抛出异常就会发生这种情况。
wait_until:和 wait_for 用法一致,唯一区别就是 “时间段” 变成 “绝对时间点” 。 // wait_for if(cv.wait_until(lk,idx * 100ms, [] {returni ==1; }))// 时间段 // wait_until autonow = std::chrono::system_clock::now();
wait_until(std::unique_lock& lock, const std::chrono::time_point& abs_time): 当前线程等待,直到条件变量被通知或达到指定的绝对时间点。在等待期间,锁会被解锁。 wait_until(std::unique_lock& lock, const std::chrono::time_point& abs_time, Predicate pred): 当前线程等待,直到条件变量被通知且谓...
wait_until导致当前线程阻塞直至通知条件变量、抵达指定时间或虚假唤醒发生,可选的循环直至满足某谓词。 1)原子地释放lock,阻塞当前线程,并将它添加到等待在*this上的线程列表。将在执行notify_all()或notify_one()时,或抵达绝对时间点timeout_time时解除阻塞线程。亦可能虚假地解除阻塞。解除阻塞时,无关缘由,重获得...
另外,wait_for 的重载版本(predicte(2))的最后一个参数 pred 表示 wait_for 的预测条件,只有当 pred 条件为 false 时调用 wait 才会阻塞当前线程,并且在收到其他线程的通知后只有当 pred 为 true 时才会被解除阻塞,因此相当于如下代码: return wait_until (lck, chrono::steady_clock::now + rel_time, s...
(2). 执行wait, wait_for或者wait_until. 这些等待动作原子性地释放mutex,并使得线程的执行暂停 (3). 当获得条件变量的通知,或者超时,或者一个虚假的唤醒,那么线程就会被唤醒,并且获得mutex. 然后线程应该检查条件是否成立,如果是虚假唤醒,就继续等待。
除wait外, 条件变量还提供了wait_for和wait_until,这两个名称是不是看着有点儿眼熟,std::mutex也提供了_for和_until操作。在C++11多线程编程中,需要等待一段时间的操作, 一般情况下都会有xxx_for和xxx_until版本。前者用于等待指定时长,后者用于等待到指定的时间。