Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Боженко Дмитрий, РК6-33Б
- R1 = 11; G1 = 7; B1 = 7;
- */
- #include <iostream>
- #include <time.h>
- #include <string>
- #include <queue>
- #include <condition_variable>
- #include <unistd.h>
- #include <iomanip>
- #include <thread>
- #include <chrono>
- #include <mutex>
- using namespace std;
- double generate(double minimal, double maximal) //ф-ия рандомного числа из заданного промежутка
- {
- double result = (rand())/RAND_MAX*(maximal - minimal) + minimal;
- return result;
- }
- double arrival_time = 0;
- //начало описания класса кассы
- class Device
- {
- private:
- double min;
- double max;
- bool state; // статус занятости устройства, 1 - свободно, 0 - занято
- std::mutex mtx;
- std::condition_variable cv; //переменная состояния
- public:
- Device(double n, double m) { min = n; max = m; state = true; };
- queue<int> q; //очередь
- void counter();
- void process(); //метод обработки транзакта
- };
- //конец описания класса кассы
- void Device::process()
- {
- std::unique_lock <std::mutex> ul (mtx);
- do
- {
- state = 1;
- double worktime = generate(min, max); //время обработки транзакта
- double t2 = arrival_time;
- cout << fixed << "Во время " << t2 << setprecision(3)
- << "транзакт " << q.front() << " встал на выполнение " << endl;
- this_thread::sleep_for(std::chrono::duration<double, std::nano>(worktime));
- double endtime = t2 + worktime;
- cout << "Во время " << endtime << setprecision(3)
- <<" транзакт " << q.front() << " обработан " << endl;
- q.pop();
- t2 = endtime;
- state = 0;
- }while (arrival_time < 3600);
- }
- int main(void)
- {
- srand((unsigned int)time(0));
- int count = 1;
- Device p1(11, 25); //создание двух объектов обслуживания
- Device p2(7, 25);
- thread th1 ([&](){
- p1.process();
- });
- thread th2 ([&](){
- p2.process();
- });
- do
- {
- double time = generate(0, 25);
- arrival_time += time;
- this_thread::sleep_for(std::chrono::duration<double, std::nano>(time));
- cout << fixed << "Во время" << arrival_time << setprecision(3) << "транзакт " << count << " встал в очередь " << endl;
- if (p2.q.size() < p1.q.size())
- { //если очердь во вторую кассу меньше
- p2.q.push(count); //транзакт встает на обработку на второе устройство
- cout << "2" << endl;
- }
- else
- {
- p1.q.push(count); //транзакт встает на обработку на первое устройство
- cout << "1" << endl;
- }
- count++;
- }while (arrival_time < 3600);
- th1.join();
- th2.join();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment