std::condition_variable:: notify_all
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Notification | ||||
|
condition_variable::notify_all
|
||||
| Waiting | ||||
| Native handle | ||||
|
void
notify_all
(
)
noexcept
;
|
(depuis C++11) | |
Débloque tous les threads actuellement en attente pour * this .
Notes
Les effets de
notify_one()
/
notify_all()
et chacune des trois parties atomiques de
wait()
/
wait_for()
/
wait_until()
(déverrouillage+attente, réveil et verrouillage) se produisent dans un ordre total unique qui peut être considéré comme
l'ordre de modification
d'une variable atomique : cet ordre est spécifique à cette variable conditionnelle individuelle. Cela rend impossible, par exemple, que
notify_one()
soit retardé et débloque un thread qui a commencé à attendre juste après l'appel à
notify_one()
ait été effectué.
Le thread notifiant n'a pas besoin de détenir le verrou sur le même mutex que celui détenu par le(s) thread(s) en attente. Le faire peut constituer une pénalisation de performance, car le thread notifié se bloquerait immédiatement à nouveau, attendant que le thread notifiant libère le verrou, bien que certaines implémentations reconnaissent ce schéma et n'essaient pas de réveiller le thread notifié sous verrou.
Exemple
#include <chrono> #include <condition_variable> #include <iostream> #include <thread> std::condition_variable cv; std::mutex cv_m; // Ce mutex est utilisé à trois fins : // 1) synchroniser les accès à i // 2) synchroniser les accès à std::cerr // 3) pour la variable de condition cv int i = 0; void waits() { std::unique_lock<std::mutex> lk(cv_m); std::cerr << "En attente... \n"; cv.wait(lk, []{ return i == 1; }); std::cerr << "...fin de l'attente. i == 1\n"; } void signals() { std::this_thread::sleep_for(std::chrono::seconds(1)); { std::lock_guard<std::mutex> lk(cv_m); std::cerr << "Notification...\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 << "Nouvelle notification...\n"; } cv.notify_all(); } int main() { std::thread t1(waits), t2(waits), t3(waits), t4(signals); t1.join(); t2.join(); t3.join(); t4.join(); }
Sortie possible :
En attente... En attente... En attente... Notification... Nouvelle notification... ...fin de l'attente. i == 1 ...fin de l'attente. i == 1 ...fin de l'attente. i == 1
Voir aussi
|
notifie un thread en attente
(fonction membre publique) |
|
|
Documentation C
pour
cnd_broadcast
|
|