Метод notify_one
Метод notify_one класса condition_variable
пробуждает один из потоков, которые в данный момент
ожидают на этом условном переменном. Если ожидающих
потоков несколько, то конкретный поток выбирается
реализацией и не гарантируется. Если ожидающих
потоков нет, то метод не делает ничего. Метод не
принимает параметров и не возвращает значения.
Синтаксис
cv.notify_one()
Пример
Давайте рассмотрим пример, в котором один поток
ожидает на условном переменном, а другой поток
пробуждает его с помощью метода notify_one:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
mutex mtx;
condition_variable cv;
bool ready = false;
void worker()
{
unique_lock<mutex> lock(mtx);
cv.wait(lock, []{ return ready; });
cout << "Worker awakened" << endl;
}
int main()
{
thread t(worker);
{
lock_guard<mutex> lock(mtx);
ready = true;
}
cv.notify_one();
t.join();
return 0;
}
Результат выполнения кода:
"Worker awakened"
Пример
Давайте рассмотрим пример, в котором метод
notify_one вызывается, когда ни один поток
не ожидает на условном переменном. В этом случае
метод не делает ничего, и последующий вызов
wait будет ожидать до следующего уведомления:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
mutex mtx;
condition_variable cv;
bool ready = false;
void worker()
{
unique_lock<mutex> lock(mtx);
cv.wait(lock, []{ return ready; });
cout << "Worker awakened" << endl;
}
int main()
{
thread t(worker);
cv.notify_one();
{
lock_guard<mutex> lock(mtx);
ready = true;
}
cv.notify_one();
t.join();
return 0;
}
Результат выполнения кода:
"Worker awakened"
Смотрите также
-
класс
condition_variable,
который представляет условное переменное -
метод
wait,
который ожидает на условном переменном -
метод
wait_for,
который ожидает на условном переменном с таймаутом -
метод
notify_all,
который пробуждает все ожидающие потоки