Метод 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,
который используется для блокировки мьютекса