32 Thread support library [thread]

32.6 Condition variables [thread.condition]

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

32.6.4.1 Noninterruptible waits [thread.condvarany.wait]

template<class Lock> void wait(Lock& lock);
Effects:
  • Atomically calls lock.unlock() and blocks on *this.
  • When unblocked, calls lock.lock() (possibly blocking on the lock) and returns.
  • The function will unblock when signaled by a call to notify_­one(), a call to notify_­all(), or spuriously.
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
]
Postconditions: lock is locked by the calling thread.
Throws: Nothing.
template<class Lock, class Predicate> void wait(Lock& lock, Predicate pred);
Effects: Equivalent to:
while (!pred())
  wait(lock);
template<class Lock, class Clock, class Duration> cv_status wait_until(Lock& lock, const chrono::time_point<Clock, Duration>& abs_time);
Effects:
  • Atomically calls lock.unlock() and blocks on *this.
  • When unblocked, calls lock.lock() (possibly blocking on the lock) and returns.
  • The function will unblock when signaled by a call to notify_­one(), a call to notify_­all(), expiration of the absolute timeout ([thread.req.timing]) specified by abs_­time, or spuriously.
  • If the function exits via an exception, lock.lock() is called prior to exiting the function.
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
]
Postconditions: lock is locked by the calling thread.
Returns: cv_­status​::​timeout if the absolute timeout ([thread.req.timing]) specified by abs_­time expired, otherwise cv_­status​::​no_­timeout.
Throws: Timeout-related exceptions ([thread.req.timing]).
template<class Lock, class Rep, class Period> cv_status wait_for(Lock& lock, const chrono::duration<Rep, Period>& rel_time);
Effects: Equivalent to:
return wait_until(lock, chrono::steady_clock::now() + rel_time);
Returns: cv_­status​::​timeout if the relative timeout ([thread.req.timing]) specified by rel_­time expired, otherwise cv_­status​::​no_­timeout.
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
]
Postconditions: lock is locked by the calling thread.
Throws: Timeout-related exceptions ([thread.req.timing]).
template<class Lock, class Clock, class Duration, class Predicate> bool wait_until(Lock& lock, const chrono::time_point<Clock, Duration>& abs_time, Predicate pred);
Effects: Equivalent to:
while (!pred())
  if (wait_until(lock, abs_time) == cv_status::timeout)
    return pred();
return true;
[Note
:
There is no blocking if pred() is initially true, or if the timeout has already expired.
— end note
]
[Note
:
The returned value indicates whether the predicate evaluates to true regardless of whether the timeout was triggered.
— end note
]
template<class Lock, class Rep, class Period, class Predicate> bool wait_for(Lock& lock, const chrono::duration<Rep, Period>& rel_time, Predicate pred);
Effects: Equivalent to:
return wait_until(lock, chrono::steady_clock::now() + rel_time, std::move(pred));