Espacios de nombres
Variantes
Acciones

Plantilla:cpp/thread/condition variable/example1

De cppreference.com
#include <iostream>
#include <condition_variable>
#include <thread>
#include <chrono>
 
std:: cv;
std::mutex cv_m; // Se usa este mutex para tres propósitos:
                 // 1) para sincronizar accesos a i
                 // 2) para sincronizar accesos a std::cerr
                 // 3) para la variable de condición cv
int i = 0;
 
void espera()
{
    std::unique_lock<std::mutex> lk(cv_m);
    std::cerr << "En espera... \n";
    cv.wait(lk, []{return i == 1;});
    std::cerr << "...terminada la espera. i == 1\n";
}
 
void indica()
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    {
        std::lock_guard<std::mutex> lk(cv_m);
        std::cerr << "Notificando...\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 << "Notificando de nuevo...\n";
    }
    cv.notify_all();
}
 
int main()
{
    std::thread t1(espera), t2(espera), t3(espera), t4(indica);
    t1.join(); 
    t2.join(); 
    t3.join();
    t4.join();
}

Posible salida:

En espera...
En espera...
En espera...
Notificando...
Notificando de nuevo...
...terminada la espera. i == 1
...terminada la espera. i == 1
...terminada la espera. i == 1