Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <thread>
  3. #include <chrono>
  4. #include <vector>
  5. #include <atomic>
  6.  
  7. int main()
  8. {
  9.     int *mas;
  10.     auto maxThreads = std::thread::hardware_concurrency();
  11.     std::vector<std::thread *> threads(maxThreads);
  12.     std::vector<int> summs(maxThreads);
  13.     std::vector<std::atomic<int>> status(maxThreads);
  14.  
  15.     srand(time(0));
  16.     size_t masSize = rand();
  17.     std::cout << "Creating mas[" << masSize << "]..." << std::endl;
  18.     mas = new int[masSize];
  19.     for (size_t i = 0; i < masSize; ++i)
  20.         mas[i] = rand();
  21.     std::cout << "done." << std::endl;
  22.  
  23.     auto parallelSummCalc = [&mas, &masSize](size_t start, int step, int &summ, std::atomic<int> & status){
  24.         if (start > masSize)
  25.             return;
  26.         for (size_t i = start; i < masSize; i += step)
  27.             summ += mas[i];
  28.         status = 1;
  29.     };
  30.  
  31.  
  32.     auto singleStart = std::chrono::system_clock::now();
  33.     int summ = 0;
  34.     std::atomic<int> s;
  35.     auto t = new std::thread(parallelSummCalc, 0, 1, std::ref(summ), std::ref(s));
  36. //  t->join();
  37.     for (;;){
  38.         if (s == 1)
  39.             break;
  40.     }
  41.     std::cout << "Single time: " << (std::chrono::system_clock::now() - singleStart).count() << std::endl;
  42.     std::cout << "Single value:" << summ << std::endl;
  43.  
  44.     t->join();
  45.     delete t;
  46.  
  47.  
  48.  
  49.  
  50.     auto dynamicStart = std::chrono::system_clock::now();
  51.     for (size_t i = 0; i < maxThreads; ++i)
  52.         threads.at(i) = new std::thread(parallelSummCalc, i, maxThreads, std::ref(summs.at(i)), std::ref(status.at(i)));
  53.  
  54. //  for (auto &thread : threads)
  55. //      thread->join();
  56.  
  57.     summ = 0;
  58. //  for (size_t i = 0; i < maxThreads; ++i){
  59. //      summ += summs.at(i);
  60. //      summs.at(i) = 0;
  61. //  }
  62.  
  63.     for (;;){
  64.         bool next = false;
  65.         for (size_t i = 0; i < maxThreads; ++i){
  66.             if (status.at(i) == 1){
  67.                 status.at(i) = 2;
  68.                 next = true;
  69.                 summ += summs.at(i);
  70.             } else if (status.at(i) == 0)
  71.                 next = true;
  72.         }
  73.         if (!next)
  74.             break;
  75.     }
  76.  
  77.     std::cout << "Dynamic(" << maxThreads << ") time: " << (std::chrono::system_clock::now() - dynamicStart).count() << std::endl;
  78.     std::cout << "Dynamic(" << maxThreads << ") value:" << summ << std::endl;
  79.  
  80.     for (auto &thread : threads){
  81.         thread->join();
  82.         delete thread;
  83.     }
  84.     threads.clear();
  85.  
  86.     delete[] mas;
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement