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

Метод 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,
    который пробуждает все ожидающие потоки
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить