Ожидание в потоке, пока количество элементов пустое

Пишу программу-модель двух касс: время выполнения некой работы на обеих касса разное и задается параметрами для 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;
}

Ответы (0 шт):