Класс 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,
который пробуждает один ожидающий поток