Wait until the std::condition_variable is notified
by a call to notify_one()
or notify_all(),
or until a specified time has been reached or the thread is woken spuriously.
template<typename Clock,typename Duration> cv_status wait_until( std::unique_lock<std::mutex>& lock, std::chrono::time_point<Clock,Duration> const& absolute_time);
- Preconditions:
lock.owns_lock()istrue, and the lock is owned by the calling thread.- Effects:
Atomically unlock the supplied
lockobject and block until the the thread is woken by a call tonotify_one()ornotify_all()by another thread, orClock::now()returns a time equal to or later thanabsolute_timeor the thread is woken spuriously. Thelockobject is locked again before the call towait_until()returns.- Returns:
std::cv_status::no_timeoutif the thread was woken by a call tonotify_one()ornotify_all()or a spurious wake-up,std::cv_status::timeoutotherwise.- Throws:
std::system_errorif the effects cannot be achieved. If thelockobject is unlocked during the call towait_until(), it is locked again on exit, even if the function exits via an exception.- Note:
The spurious wake ups mean that a thread calling
wait_until()may wake even though no thread has callednotify_one()ornotify_all(). It is therefore recommended that the overload ofwait_until()that takes a predicate is used in preference where possible. Otherwise, it is recommended thatwait_until()be called in a loop which tests the predicate associated with the condition variable. There is no guarantee as to how long the calling thread will be blocked for, only that if the function returnsfalsethenClock::now()returned a time equal to or later thanabsolute_timeat the point at which the thread became unblocked.- Synchronization:
Calls to
notify_one(),notify_all(),wait(),wait_for()andwait_until()on a singlestd::condition_variableinstance are serialized. A call tonotify_one()ornotify_all()will only wake threads that started waiting prior to that call.
Header
#include <condition_variable>