Advertisement
uzimane_

mnogopotok 2

Oct 30th, 2020 (edited)
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. #include <windows.h>
  2. #include <iostream>
  3. #include <random>
  4. #include <vector>
  5. #include <thread>
  6. #include <future>
  7.  
  8. using namespace std;
  9.  
  10. class Timer { // found in internet
  11. private:
  12.     using clock_t = std::chrono::high_resolution_clock;
  13.     using second_t = std::chrono::duration<double, std::ratio<1> >;
  14.  
  15.     std::chrono::time_point<clock_t> m_beg;
  16.  
  17. public:
  18.     Timer() : m_beg(clock_t::now()) { }
  19.  
  20.     double elapsed() const {
  21.         return std::chrono::duration_cast<second_t>(clock_t::now() - m_beg).count();
  22.     }
  23. };
  24.  
  25. struct Result {
  26.     int minimal_val;
  27.     int maximal_val;
  28.     int minimal_index;
  29.     int maximal_index;
  30.  
  31.     Result() {
  32.         this->minimal_val = INT_MAX;
  33.         this->maximal_val = INT_MIN;
  34.         this->minimal_index = 0;
  35.         this->maximal_index = 0;
  36.     }
  37. };
  38.  
  39. vector<int> vect;
  40.  
  41. void search(promise <Result>& prms, int leftIdx, int rightIdx) {
  42.     Result threadAns = Result();
  43.  
  44.     for (int i = leftIdx; i <= rightIdx; ++i) {
  45.         if (vect[i] > threadAns.maximal_val)
  46.         {
  47.             threadAns.maximal_val = vect[i];
  48.             threadAns.maximal_index = i;
  49.         }
  50.         if (vect[i] < threadAns.minimal_val)
  51.         {
  52.             threadAns.minimal_val = vect[i];
  53.             threadAns.minimal_index = i;
  54.         }
  55.     }
  56.  
  57.     prms.set_value(threadAns);
  58. }
  59.  
  60. void start(int i) {
  61.     Result overall_answer = Result();
  62.     vector <thread> threads(i);
  63.     vector <promise <Result> > promises(i);
  64.  
  65.     int leftGran = 0;
  66.     int rightGran = 0;
  67.  
  68.     cout << "\nUsing " << i << " threads\n";
  69.  
  70.     Timer timer;
  71.  
  72.     for (int j = 0; j < i; j++) {
  73.         leftGran = rightGran;
  74.         rightGran = leftGran + (vect.size() / i);
  75.  
  76.         if (j + 1 == i) {
  77.             rightGran = vect.size() - 1;
  78.         }
  79.  
  80.         threads[j] = thread(search, ref(promises[j]), leftGran, rightGran);
  81.     }
  82.  
  83.     for (int j = 0; j < i; j++) {
  84.         threads[j].join();
  85.  
  86.         Result localAnswer = promises[j].get_future().get();
  87.         if (localAnswer.maximal_val > overall_answer.maximal_val) {
  88.             overall_answer.maximal_index = localAnswer.maximal_index;
  89.             overall_answer.maximal_val = localAnswer.maximal_val;
  90.         }
  91.  
  92.         if (localAnswer.minimal_val < overall_answer.minimal_val) {
  93.             overall_answer.minimal_index = localAnswer.minimal_index;
  94.             overall_answer.minimal_val = localAnswer.minimal_val;
  95.         }
  96.     }
  97.  
  98.     cout << "min value: " << overall_answer.minimal_val << " | index: " << overall_answer.minimal_index << endl;
  99.     cout << "max value:  " << overall_answer.maximal_val << " | index: " << overall_answer.maximal_index << endl;
  100.     cout << "time taken: " << timer.elapsed() << " sec" << endl << endl;
  101. }
  102.  
  103. int main() {
  104.     mt19937 mersenne;
  105.     mersenne.seed(time(0));
  106.  
  107.     cout << "array lenght: ";
  108.     int arrLength;
  109.     cin >> arrLength;
  110.  
  111.     for (int i = 0; i < arrLength; i++) {
  112.         vect.push_back(mersenne());
  113.     }
  114.  
  115.     for (int i = 2; i <= 16; i *= 2) {
  116.         start(i);
  117.     }
  118.  
  119.     return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement