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

Класс condition_variable

Класс condition_variable представляет собой примитив синхронизации, который позволяет одному или нескольким потокам ожидать наступления определенного события. Он используется совместно с мьютексом и условной переменной для организации взаимодействия между потоками. В первом параметре методов wait и wait_for мы передаем объект unique_lock, который блокирует мьютекс на время ожидания, а во втором параметре (для wait_for) - время ожидания. Метод notify_one пробуждает один ожидающий поток, а notify_all - все ожидающие потоки.

Синтаксис

#include <condition_variable> std::condition_variable cv; // Ожидание cv.wait(lock); cv.wait(lock, predicate); cv.wait_for(lock, duration); cv.wait_for(lock, duration, predicate); // Уведомление cv.notify_one(); cv.notify_all();

Пример

Давайте рассмотрим простой пример использования condition_variable для синхронизации двух потоков:

#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 thread is running" << endl; } int main() { thread t(worker); { lock_guard<mutex> lock(mtx); ready = true; } cv.notify_one(); t.join(); return 0; }

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

"Worker thread is running"

Пример

Давайте рассмотрим пример с использованием wait_for для ожидания с таймаутом:

#include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <chrono> using namespace std; mutex mtx; condition_variable cv; bool ready = false; void worker() { unique_lock<mutex> lock(mtx); if (cv.wait_for(lock, chrono::seconds(1), []{ return ready; })) { cout << "Data is ready" << endl; } else { cout << "Timeout occurred" << endl; } } int main() { thread t(worker); t.join(); return 0; }

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

"Timeout occurred"

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

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