32 Thread support library [thread]

32.6 Condition variables [thread.condition]

32.6.4 Class condition_­variable_­any [thread.condition.condvarany]

32.6.4.2 Interruptible waits [thread.condvarany.intwait]

The following wait functions will be notified when there is a stop request on the passed stop_­token.
In that case the functions return immediately, returning false if the predicate evaluates to false.
template<class Lock, class Predicate> bool wait(Lock& lock, stop_token stoken, Predicate pred);
Effects: Registers for the duration of this call *this to get notified on a stop request on stoken during this call and then equivalent to:
while (!stoken.stop_requested()) {
  if (pred())
    return true;
  wait(lock);
}
return pred();
[Note
:
The returned value indicates whether the predicate evaluated to true regardless of whether there was a stop request.
— end note
]
Postconditions: lock is locked by the calling thread.
Remarks: If the function fails to meet the postcondition, terminate is called ([except.terminate]).
[Note
:
This can happen if the re-locking of the mutex throws an exception.
— end note
]
Throws: Any exception thrown by pred.
template<class Lock, class Clock, class Duration, class Predicate> bool wait_until(Lock& lock, stop_token stoken, const chrono::time_point<Clock, Duration>& abs_time, Predicate pred);
Effects: Registers for the duration of this call *this to get notified on a stop request on stoken during this call and then equivalent to:
while (!stoken.stop_requested()) {
  if (pred())
    return true;
  if (cv.wait_until(lock, abs_time) == cv_status::timeout)
    return pred();
}
return pred();
[Note
:
There is no blocking if pred() is initially true, stoken.stop_­requested() was already true or the timeout has already expired.
— end note
]
[Note
:
The returned value indicates whether the predicate evaluated to true regardless of whether the timeout was triggered or a stop request was made.
— end note
]
Postconditions: lock is locked by the calling thread.
Remarks: If the function fails to meet the postcondition, terminate is called ([except.terminate]).
[Note
:
This can happen if the re-locking of the mutex throws an exception.
— end note
]
Throws: Timeout-related exceptions ([thread.req.timing]), or any exception thrown by pred.
template<class Lock, class Rep, class Period, class Predicate> bool wait_for(Lock& lock, stop_token stoken, const chrono::duration<Rep, Period>& rel_time, Predicate pred);
Effects: Equivalent to:
return wait_until(lock, std::move(stoken), chrono::steady_clock::now() + rel_time,
                  std::move(pred));