std::condition_variable_any:: notify_all
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Notification | ||||
|
condition_variable_any::notify_all
|
||||
| Waiting | ||||
|
void
notify_all
(
)
noexcept
;
|
(desde C++11) | |
Desbloquea todos los hilos que actualmente esperan por * this .
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) ocurren en un único orden total que puede verse como el
orden de modificación
de una variable atómica: el orden es específico de esta variable de condición individual. Esto hace imposible que
notify_one()
pueda, por ejemplo, retrasarse y desbloquear un hilo que comenzó a esperar justo después de que se realizara la llamada a
notify_one()
.
El hilo que notifica no necesita mantener el bloqueo en el mismo mutex que el mantenido por el hilo(s) en espera. Hacerlo puede ser una pessimización, ya que el hilo notificado bloquearía inmediatamente nuevamente, esperando a que el hilo notificador libere el bloqueo, aunque algunas implementaciones reconocen el patrón y no intentan despertar al hilo que es notificado bajo bloqueo.
Ejemplo
#include <chrono> #include <condition_variable> #include <iostream> #include <thread> std::condition_variable_any cv; std::mutex cv_m; // Este mutex se utiliza para tres propósitos: // 1) sincronizar accesos a i // 2) sincronizar accesos a std::cerr // 3) para la variable de condición 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(); }
Salida posible:
Waiting... Waiting... Waiting... Notifying... Notifying again... ...finished waiting. i == 1 ...finished waiting. i == 1 ...finished waiting. i == 1
Véase también
|
notifica un hilo en espera
(función miembro pública) |
|
|
Documentación C
para
cnd_broadcast
|
|