std::condition_variable is a synchronization primitive used with a std::mutex to block one or more threads until another thread both modifies a shared variable (the condition) and notifies the std::condition_variable .
The thread that intends to modify the shared variable must:
Even if the shared variable is atomic, it must be modified while owning the mutex to correctly publish the modification to the waiting thread.
Any thread that intends to wait on a std::condition_variable must:
std::condition_variable works only with std:: unique_lock < std:: mutex > , which allows for maximal efficiency on some platforms. std::condition_variable_any provides a condition variable that works with any BasicLockable object, such as std::shared_lock .
Condition variables permit concurrent invocation of the wait , wait_for , wait_until , notify_one and notify_all member functions.
Name | Definition |
native_handle_type | implementation-defined |
std::condition_variable is used in combination with a std::mutex to facilitate inter-thread communication.
Run this code#include #include #include #include #include std::mutex m; std::condition_variable cv; std::string data; bool ready = false; bool processed = false; void worker_thread() { // wait until main() sends data std::unique_lock lk(m); cv.wait(lk, []{ return ready; }); // after the wait, we own the lock std::cout "Worker thread is processing data\n"; data += " after processing"; // send data back to main() processed = true; std::cout "Worker thread signals data processing completed\n"; // manual unlocking is done before notifying, to avoid waking up // the waiting thread only to block again (see notify_one for details) lk.unlock(); cv.notify_one(); } int main() { std::thread worker(worker_thread); data = "Example data"; // send data to the worker thread { std::lock_guard lk(m); ready = true; std::cout "main() signals data ready for processing\n"; } cv.notify_one(); // wait for the worker { std::unique_lock lk(m); cv.wait(lk, []{ return processed; }); } std::cout "Back in main(), data = " data '\n'; worker.join(); }
main() signals data ready for processing Worker thread is processing data Worker thread signals data processing completed Back in main(), data = Example data after processing