# std::condition_variable_any::wait

From cppreference.com
< cpp‎ | thread‎ | condition variable any

template< class Lock > void wait( Lock& lock ); | (1) | (since C++11)
template< class Lock, class Predicate > void wait( Lock& lock, Predicate pred ); | (2) | (since C++11)

`wait` causes the current thread to block until the condition variable is notified or a spurious wakeup occurs, optionally looping until some predicate is satisfied.

1) Atomically unlocks `lock`, blocks the current executing thread, and adds it to the list of threads waiting on *this. The thread will be unblocked when notify_all() or notify_one() is executed. It may also be unblocked spuriously. When unblocked, regardless of the reason, `lock` is reacquired and `wait` exits. If this function exits via exception, `lock` is also reacquired. (until C++14)
2) Equivalent to

    while (!pred()) {
        wait(lock);
    }

This overload may be used to ignore spurious awakenings while waiting for a specific condition to become true.

Note that `lock` must be acquired before entering this method, and it is reacquired after `wait(lock)` exits, which means that `lock` can be used to guard access to `pred()`.

If these functions fail to meet the postconditions (lock is locked by the calling thread), std::terminate is called. For example, this could happen if relocking the mutex throws an exception, | (since C++14)

### Parameters

lock | - | an object of type `Lock` that meets the BasicLockable requirements, which must be locked by the current thread
pred | - | predicate which returns ​false if the waiting should be continued. The signature of the predicate function should be equivalent to the following: bool pred();​

### Return value

(none)

### Exceptions

1)

May throw std::system_error, may also propagate exceptions thrown by lock.lock() or lock.unlock(). | (until C++14)
Does not throw | (since C++14)

2) Same as (1) but may also propagate exceptions thrown by `pred`

### Notes

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 <iostream>
    #include <condition_variable>
    #include <thread>
    #include <chrono>

    std::condition_variable_any 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

### See also

wait_for | blocks the current thread until the condition variable is woken up or after the specified timeout duration (public member function)
wait_until | blocks the current thread until the condition variable is woken up or until specified time point has been reached (public member function)

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/thread/condition_variable_any/wait&oldid=90355"