const int dataSize = 200;const int bufSize = 10;std::list<int> listTask;std::list<QString> rezult;QMutex mutexRezult;QMutex mutex;QWaitCondition bufNotFull;QWaitCondition bufNotEmpty;
void run() { for (int i = 0; i < dataSize; i++) { mutex.lock(); // Блокирем мютекс while (listTask.size() == bufSize) // Если буфер полный bufNotFull.wait(&mutex); // Ждем побудки буфер не полный listTask.push_back(i); // Генерируем задачу bufNotEmpty.wakeAll(); // Побудка что буфер не пустой mutex.unlock(); // Разблокируем мютекс } }
void run() { for (int i = 0; i < dataSize; i++) { mutex.lock(); // Блокируем мютекс while (listTask.size() == 0) // Если буфер пустой bufNotEmpty.wait(&mutex); // Ждем побудки буфер не пустой int task = *listTask.begin(); // Получаем задачу listTask.pop_front(); bufNotFull.wakeAll(); // Побудка буфер не полный mutex.unlock(); // Разблокируем мютекс msleep(1 + rand()%100); // Обрабатываем задачу // Выводим результат работы QString s = tr("Thread = %1 *** Task = %2"). arg(m_numThread). arg(task); mutexRezult.lock(); rezult.push_back(s); mutexRezult.unlock(); } }
CConsumer consumer1(1); CConsumer consumer2(2); CConsumer consumer3(3); CProducer producer; consumer1.start(); consumer2.start(); consumer3.start(); producer.start();
C++ (Qt)if (listTask.size() == bufSize) // Если буфер полный bufNotFull.wait(&mutex); // Ждем побудки буфер не полный
C++ (Qt)bufNotEmpty.wakeAll(); <--- сейчас эта нитка владеет мутексомmutex.unlock();
C++ (Qt)bufNotEmpty.waitl(&mutex); <--- сейчас эта нитка владеет мутексомmutex.unlock();