std::condition_variable::notify_all - cppreference.com
De cppreference.com
|
|
(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 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