Метод wait
Метод wait класса condition_variable блокирует
вызывающий поток до тех пор, пока переменная условия не будет
уведомлена через notify_one или notify_all. Перед
блокировкой поток освобождает мьютекс, а после пробуждения снова
захватывает его. Первым параметром метод принимает объект
unique_lock, который удерживает мьютекс. Вторым
(необязательным) параметром можно передать предикат - функцию
или лямбда-выражение, которое проверяет условие. Если предикат
возвращает false, поток продолжает ожидание, что защищает
от ложных пробуждений.
Синтаксис
cv.wait(lock);
cv.wait(lock, predicate);
Пример
Давайте рассмотрим простой пример, в котором один поток
ожидает сигнала от другого с помощью метода 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 is running" << endl;
}
int main()
{
thread t(worker);
{
lock_guard<mutex> lock(mtx);
ready = true;
}
cv.notify_one();
t.join();
return 0;
}
Результат выполнения кода:
"Worker is running"
Пример
Давайте рассмотрим пример с очередью задач, где потребитель
ожидает появления данных с помощью метода wait:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
using namespace std;
mutex mtx;
condition_variable cv;
queue<int> tasks;
void consumer()
{
unique_lock<mutex> lock(mtx);
cv.wait(lock, []{ return !tasks.empty(); });
int task = tasks.front();
tasks.pop();
lock.unlock();
cout << "Got task: " << task << endl;
}
int main()
{
thread t(consumer);
{
lock_guard<mutex> lock(mtx);
tasks.push(42);
}
cv.notify_one();
t.join();
return 0;
}
Результат выполнения кода:
"Got task: 42"
Смотрите также
-
класс
condition_variable,
который управляет условными переменными -
метод
wait_for,
который ожидает с ограничением по времени -
метод
notify_one,
который пробуждает один ожидающий поток -
метод
notify_all,
который пробуждает все ожидающие потоки