РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
795 of 815 menu

Метод notify_all

Метод notify_all класса condition_variable пробуждает все потоки, которые в данный момент ожидают на этом условном переменном. Метод не принимает параметров и не возвращает значения. Обычно используется после изменения общего состояния данных, чтобы разбудить все ожидающие потоки и дать им возможность проверить условие заново.

Синтаксис

cv.notify_all()

Пример

Давайте создадим два потока, которые ожидают на условном переменном, и главный поток, который изменяет общее состояние и пробуждает все ожидающие потоки:

#include <iostream> #include <thread> #include <mutex> #include <condition_variable> using namespace std; mutex mtx; condition_variable cv; bool ready = false; void worker(int id) { unique_lock<mutex> lock(mtx); cv.wait(lock, [] { return ready; }); cout << "Thread " << id << " awakened" << endl; } int main() { thread t1(worker, 1); thread t2(worker, 2); { lock_guard<mutex> lock(mtx); ready = true; } cv.notify_all(); t1.join(); t2.join(); return 0; }

Результат выполнения кода:

"Thread 1 awakened" "Thread 2 awakened"

Пример

Давайте рассмотрим пример, где несколько потоков ожидают на условном переменном, а главный поток пробуждает их все после завершения подготовки данных:

#include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <vector> using namespace std; mutex mtx; condition_variable cv; bool data_ready = false; void consumer(int id) { unique_lock<mutex> lock(mtx); cv.wait(lock, [] { return data_ready; }); cout << "Consumer " << id << " got data" << endl; } int main() { vector<thread> threads; for (int i = 1; i <= 3; ++i) { threads.emplace_back(consumer, i); } { lock_guard<mutex> lock(mtx); data_ready = true; } cv.notify_all(); for (auto& t : threads) { t.join(); } return 0; }

Результат выполнения кода:

"Consumer 1 got data" "Consumer 2 got data" "Consumer 3 got data"

Смотрите также

  • класс condition_variable,
    который представляет условную переменную
  • метод wait,
    который блокирует поток до пробуждения
  • метод notify_one,
    который пробуждает один ожидающий поток
  • класс unique_lock,
    который используется для блокировки мьютекса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить