std::condit...le::wait_for(3)
okay bestie, welcome to the C++ Standard Libary manual page for std::condition_variable::wait_for. It's giving "waiting, but make it chrono." π
β¨
πΈ NAME πΈ
std::condition_variable::wait_for β literally std::condition_variable::wait_for, no cap. That's the whole name, bestie. π«Ά
β¨ Synopsis β¨
Here's the signature in all its exactness:
template< class Rep, class Period >
std::cv_status wait_for( std::unique_lock<std::mutex>& lock,
(1) (since C++11)
const std::chrono::duration<Rep, Period>&
rel_time );
template< class Rep, class Period, class Predicate >
bool wait_for( std::unique_lock<std::mutex>& lock,
(2) (since C++11)
const std::chrono::duration<Rep, Period>& rel_time,
Predicate pred );
wait_for causes the current thread to block until the condition variable is notified, the given duration has been elapsed, or a spurious wakeup occurs. pred can be optionally provided to detect a spurious wakeup. π€
- Equivalent to
return wait_until(lock, std::chrono::steady_clock::now() + rel_time);. - Equivalent to
return wait_until(lock, std::chrono::steady_clock::now() + rel_time, std::move(pred));. This overload may be used to ignore spurious awakenings while waiting for a specific condition to become true.
Right after wait_for returns, lock.owns_lock() is true, and lock.mutex() is locked by the calling thread. If these postconditions cannot be satisfied^[1], calls std::terminate.
If any of the following conditions is satisfied, the behavior is undefined:
lock.owns_lock()isfalse.lock.mutex()is not locked by the calling thread.- If some other threads are also waiting on
*this,lock.mutex()is different from the mutex unlocked by the waiting functions (wait,wait_forandwait_until) called on*thisby those threads.
- β This can happen if the re-locking of the mutex throws an exception.
π Parameters π
lockβ an lock which must be locked by the calling thread.rel_timeβ the maximum duration to wait.predβ the predicate to check whether the waiting can be completed.
π¦ Type requirements π¦
Predicatemust meet the requirements ofFunctionObject.
π Return value π
std::cv_status::timeoutifrel_timehas been elapsed since the beginning of this call, otherwisestd::cv_status::no_timeout.- The latest result of
pred()before returning to the caller.
π₯ Exceptions π₯
- Timeout-related exceptions.
- Timeout-related exceptions, and any exception thrown by
pred.
π Notes π
Even if notified under lock, overload (1) makes no guarantees about the state of the associated predicate when returning due to timeout.
The effects of notify_one()/notify_all() and each of the three atomic parts of wait()/wait_for()/wait_until() (unlock+wait, wakeup, and lock) take place in a single total order that can be viewed as modification order of an atomic variable: the order is specific to this individual condition variable. This makes it impossible for notify_one() to, for example, be delayed and unblock a thread that started waiting just after the call to notify_one() was made. π
π Example π
// Run this code
#include <chrono>
#include <condition_variable>
#include <iostream>
#include <thread>
std::condition_variable cv;
std::mutex cv_m; // This mutex is used for three purposes:
// 1) to synchronize accesses to i
// 2) to synchronize accesses to std::cerr
// 3) for the condition variable cv
int i = 0;
void waits()
{
std::unique_lock<std::mutex> lk(cv_m);
std::cerr << "Waiting... \n";
cv.wait(lk, []{ return i == 1; });
std::cerr << "...finished waiting. i == 1\n";
}
void signals()
{
std::this_thread::sleep_for(std::chrono::seconds(1));
{
std::lock_guard<std::mutex> lk(cv_m);
std::cerr << "Notifying...\n";
}
cv.notify_all();
std::this_thread::sleep_for(std::chrono::seconds(1));
{
std::lock_guard<std::mutex> lk(cv_m);
i = 1;
std::cerr << "Notifying again...\n";
}
cv.notify_all();
}
int main()
{
std::thread t1(waits), t2(waits), t3(waits), t4(signals);
t1.join();
t2.join();
t3.join();
t4.join();
}
Possible output:
Waiting...
Waiting...
Waiting...
Notifying...
Notifying again...
...finished waiting. i == 1
...finished waiting. i == 1
...finished waiting. i == 1
π Defect reports π
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
- DR
LWG 2093, applied to C++11 β behavior as published: timeout-related exceptions were missing in the specification; correct behavior: mentions these exceptions. - DR
LWG 2135, applied to C++11 β behavior as published: the behavior was unclear iflock.lock()throws an exception; correct behavior: callsstd::terminatein this case.
β See also β
waitβ blocks the current thread until the condition variable is awakened (public member function).wait_untilβ blocks the current thread until the condition variable is awakened or until specified time point has been reached (public member function).
π«Ά Hidden category π«Ά
- Pages with unreviewed LWG DR marker
Source/version/date tea: http://cppreference.com, 2024.06.10 β and the footer title is std::condit...le::wait_for(3). Byeee, go wait on something cute. ππ¦
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms