Ожидание в потоке, пока количество элементов пустое
Пишу программу-модель двух касс: время выполнения некой работы на обеих касса разное и задается параметрами для Cashier q(a, b), где a, b - минимальное и максимальное время работы на кассе.
Столкнулся с такой проблемой, что кассе нужно ожидать, пока в очереди будет хотя бы один элемент (клиент). Пытался сделать через cv.wait, но не знаю, как это сделать до конца вследствие того, что я только начал работать с потоками :(
Проблема в методе Job(). После while(q.empty) следует дописать какое-то условие ожидания, а как только элементов в очереди станет больше чем 0, то идет обработка дальше.
Код программы:
#include <iostream>
#include <time.h>
#include <string>
#include <thread>
#include <chrono>
#include <mutex>
#include <queue>
#include <condition_variable>
#include <unistd.h>
using namespace std;
double arrival_time = 0 ;
double uniform(double min, double max)
{
return (double)(rand())/RAND_MAX*(max - min) + min;
}
class Cashier {
private:
double min;
double max;
bool status; // true - свободен, false - занят
std::mutex mtx;
std::condition_variable cv;
public:
Cashier(double a, double b) { min = a; max = b; status = true; };
void Job();
void counter();
queue<int> q;
};
void Cashier::Job(){
std::unique_lock <std::mutex> ul (mtx);
while (arrival_time < 3600) {
while (q.empty())
//cv.wait(ul, ??? )
status = 1;
double worktime = uniform(min, max);
double t2 = arrival_time;
printf("В момент времени %.3f транзакт %d встал на выполнение \n", t2, q.front());
this_thread::sleep_for(std::chrono::duration<double, std::nano>(worktime));
double endtime = t2 + worktime;
printf("В момент времени %.3f транзакт %d обработан \n", endtime, q.front());
q.pop();
t2 = endtime;
status = 0;
//cv.notify_one();
}
//ul.unlock();
}
int main () {
srand((unsigned int)time(0));
int counter = 1;
Cashier q1(6, 26);
Cashier q2(9, 26);
thread th1 ([&](){
q1.Job();
});
thread th2 ([&](){
q2.Job();
});
while (arrival_time < 3600) {
double time = uniform (0, 26);
arrival_time += time;
this_thread::sleep_for(std::chrono::duration<double, std::nano>(time));
printf("В момент времени %.3f транзакт %d встал в очередь ", arrival_time, counter);
if (q2.q.size() < q1.q.size()) {
q2.q.push(counter);
cout << "2" << endl;
}
else {
q1.q.push(counter);
cout << "1" << endl;
}
counter++;
}
th1.join();
th2.join();
return 0;
}