BorrowTheProgrammer

dz4

Jan 9th, 2021
1,018
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.09 KB | None | 0 0
  1. /*Боженко Дмитрий, РК6-33Б
  2.  R1 = 11; G1 = 7; B1 = 7;
  3.  */
  4. #include <iostream>
  5. #include <time.h>
  6. #include <string>
  7. #include <queue>
  8. #include <condition_variable>
  9. #include <unistd.h>
  10. #include <iomanip>
  11. #include <thread>
  12. #include <chrono>
  13. #include <mutex>
  14.  
  15. using namespace std;
  16.  
  17. double generate(double minimal, double maximal)      //ф-ия рандомного числа из заданного промежутка
  18. {
  19.   double result = (rand())/RAND_MAX*(maximal - minimal) + minimal;
  20.   return result;
  21. }
  22.  
  23. double arrival_time = 0;
  24.  
  25. //начало описания класса кассы
  26. class Device
  27. {
  28.   private:
  29.     double min;
  30.     double max;
  31.     bool state;            // статус занятости устройства, 1 - свободно, 0 - занято
  32.     std::mutex mtx;
  33.     std::condition_variable cv;     //переменная состояния
  34.   public:
  35.     Device(double n, double m) { min = n; max = m; state = true; };
  36.     queue<int> q;     //очередь
  37.     void counter();
  38.     void process();  //метод обработки транзакта
  39. };
  40. //конец описания класса кассы
  41.  
  42. void Device::process()
  43. {
  44.     std::unique_lock <std::mutex> ul (mtx);
  45.     do
  46.     {
  47.       state = 1;
  48.       double worktime = generate(min, max);  //время обработки транзакта
  49.       double t2 = arrival_time;
  50.       cout << fixed << "Во время " << t2 << setprecision(3)
  51.            << "транзакт " << q.front() << " встал на выполнение " << endl;
  52.       this_thread::sleep_for(std::chrono::duration<double, std::nano>(worktime));
  53.       double endtime = t2 + worktime;
  54.       cout << "Во время " << endtime << setprecision(3)
  55.            <<" транзакт " << q.front() << " обработан " << endl;
  56.       q.pop();
  57.       t2 = endtime;
  58.       state = 0;
  59.     }while (arrival_time < 3600);
  60. }
  61.  
  62. int main(void)
  63. {
  64.     srand((unsigned int)time(0));
  65.     int count = 1;
  66.     Device p1(11, 25);  //создание двух объектов обслуживания
  67.     Device p2(7, 25);
  68.  
  69.     thread th1 ([&](){
  70.         p1.process();
  71.     });
  72.     thread th2 ([&](){
  73.         p2.process();
  74.     });
  75.    
  76.     do
  77.     {
  78.       double time = generate(0, 25);
  79.       arrival_time += time;
  80.       this_thread::sleep_for(std::chrono::duration<double, std::nano>(time));
  81.  
  82.       cout << fixed << "Во время" << arrival_time << setprecision(3) << "транзакт " << count << " встал в очередь " << endl;
  83.  
  84.       if (p2.q.size() < p1.q.size())
  85.       { //если очердь во вторую кассу меньше
  86.         p2.q.push(count);     //транзакт встает на обработку на второе устройство
  87.         cout << "2" << endl;
  88.       }
  89.       else
  90.       {
  91.         p1.q.push(count);   //транзакт встает на обработку на первое устройство
  92.         cout << "1" << endl;
  93.       }
  94.       count++;
  95.     }while (arrival_time < 3600);
  96.  
  97.     th1.join();
  98.     th2.join();
  99.     return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment