std::condition_variable_any::notify_all
void notify_all() noexcept; |
(desde C++11) | |
Desbloquea todos los hilos que están esperando en *this.
Parámetros
(Ninguno)
Valor de retorno
(Ninguno)
Notas
Los efectos de notify_one()/notify_all() y cada una de las tres partes atómicas de wait()/wait_for()/wait_until() (desbloquear+esperar, despertar y bloquear) tienen lugar en un solo orden total que se puede ver como el orden de modificación de una variable atómica: el orden es específico para esta variable de condición individual. Esto hace imposible que notify_one() por ejemplo, se retrase y desbloquee un hilo que comenzó a esperar justo después de que se hizo la llamada a notify_one().
El hilo de notificación no necesita mantener el bloqueo en el mismo mutex que el que tienen los hilos en espera; de hecho, hacerlo es una pesimización, ya que el hilo notificado se volvería a bloquear inmediatamente, esperando que el hilo notificante libere el bloqueo.
Ejemplo
#include <iostream>
#include <condition_variable>
#include <thread>
#include <chrono>
std::condition_variable_any 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
Véase también
| Notifica a un hilo en espera. (función miembro pública) | |
Documentación de C para cnd_broadcast
| |