text: Работа с условными переменными обеспечивается средствами, объявленными в заголовочном файле condition_variable Исходный текст на языке С++ (С++11) #include <cstdlib> #include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <chrono> #define STORAGE_MIN 10 #define STORAGE_MAX 20 int storage = STORAGE_MIN; std::mutex globalMutex; std::condition_variable condition; /* Функция потока потребителя */ void consumer() { std::cout << " thread started" << std::endl; int toConsume = 0; while(true) { std::unique_lock<std::mutex> lock(globalMutex); /* Если значение общей переменной меньше максимального, * то поток входит в состояние ожидания сигнала о достижении * максимума */ if (storage < STORAGE_MAX) { condition.wait(lock); // Атомарно _отпускает мьютекс_ и сразу же блокирует поток toConsume = storage-STORAGE_MIN; std::cout << " storage is maximum, consuming " << toConsume << std::endl; } /* "Потребление" допустимого объема из значения общей * переменной */ storage -= toConsume; std::cout << " storage = " << storage << std::endl; } } /* Функция потока производителя */ void producer() { std::cout << " thread started" << std::endl; while (true) { std::this_thread::sleep_for(std::chrono::milliseconds(200)); std::unique_lock<std::mutex> lock(globalMutex); ++storage; std::cout << " storage = " << storage << std::endl; /* Если значение общей переменной достигло или превысило * максимум, поток потребитель уведомляется об этом */ if (storage >= STORAGE_MAX) { std::cout << " storage maximum" << std::endl; condition.notify_one(); } } } int main(int argc, char *argv) { std::thread thProducer(producer); std::thread thConsumer(consumer); thProducer.join(); thConsumer.join(); return 0; } Исходный текст на языке C++ c использованием библиотек Qt cw.h #ifndef CW_H #define CW_H #include <QThread> #include <QMutex> #include <QWaitCondition> #include <QDebug> #define STORAGE_MIN 10 #define STORAGE_MAX 20 extern int storage; extern QMutex qmt; extern QWaitCondition condition; class Producer : public QThread { Q_OBJECT private: void run() { qDebug() << " thread started"; while (1) { QThread::msleep(200); qmt.lock(); ++storage; qDebug() << " storage = " << storage; /* Если значение общей переменной достигло или превысило * максимум, поток потребитель уведомляется об этом */ if (storage >= STORAGE_MAX) { qDebug() << " storage maximum"; condition.wakeOne(); } qmt.unlock(); } } }; class Consumer : public QThread { Q_OBJECT private: void run() { qDebug() << " thread started"; int toConsume = 0; while(1) { qmt.lock(); /* Если значение общей переменной меньше максимального, * то поток входит в состояние ожидания сигнала о достижении * максимума */ if (storage < STORAGE_MAX) { condition.wait(&qmt); toConsume = storage-STORAGE_MIN; qDebug() << " storage is maximum, consuming " << toConsume; } /* "Потребление" допустимого объема из значения общей * переменной */ storage -= toConsume; qDebug() << " storage = " << storage; qmt.unlock(); } } }; #endif /* CW_H */ main.cpp #include <QCoreApplication> #include "cw.h" int storage = STORAGE_MIN; QMutex qmt; QWaitCondition condition; int main(int argc, char *argv) { QCoreApplication app(argc, argv); Producer prod; Consumer cons; prod.start(); cons.start(); return app.exec(); } В языке Python условные переменные реализованы в виде экземпляров класса Condition модуля threading.