Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
1,306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.72 KB | None | 0 0
  1. #include <atomic>
  2. #include <chrono>
  3. #include <iostream>
  4. #include <random>
  5. #include <thread>
  6. #include <utility>
  7. #include <vector>
  8. #include <mutex>
  9.  
  10. constexpr long long size= 100000; //size elemente pt suma
  11.  
  12. constexpr long long firBound= 2500;
  13. constexpr long long secBound= 5000;
  14. constexpr long long thiBound= 7500;
  15. constexpr long long fouBound= 10000;
  16.  
  17. constexpr long long firBound1= 5000;//in caz ca se vor doar 2 th
  18. constexpr long long secBound1= 10000;//in caz ca se vor doar 2 th
  19. //var1
  20. std::mutex myMutex;//protejeaza resursele shared sa fie accesate simultan de mai multe th
  21. void sumUp(unsigned long long& sum, const std::vector<int>& val, unsigned long long beg, unsigned long long end){
  22. for (auto it= beg; it < end; ++it){
  23. std::lock_guard<std::mutex> myLock(myMutex);
  24. sum+= val[it];
  25. }//aici se face suma propriu zisa
  26. }
  27. //end varianta1
  28.  
  29. //varianta2 mai rapida ca si unu dar se poate folosi oricare
  30. //la atomic nu mai este necesara protectia resurselor partajate fiindca deja avem int care e element atomic si care nu poate fi shared
  31. /*void sumUp(std::atomic<unsigned long long>& sum, const std::vector<int>& val, unsigned long long beg, unsigned long long end){
  32. for (auto it= beg; it < end; ++it){
  33. sum+= val[it];
  34. }
  35. }*/
  36. //end varianta2
  37. int main(){
  38.  
  39. std::cout << std::endl;
  40.  
  41. std::vector<int> randValues;
  42. randValues.reserve(size);
  43.  
  44. std::mt19937 engine; //generator pseudo random
  45. std::uniform_int_distribution<> uniformDist(1,10);//distributia de la 1 la 10
  46. for ( long long i=0 ; i< size ; ++i) randValues.push_back(uniformDist(engine));//efectiv generarea vectorului
  47. //var1
  48. unsigned long long sum= 0; //asta merge cu mutex ->se declara variabila sum long long egal cu 0
  49. //end var1
  50.  
  51. //varianta2
  52. //std::atomic<unsigned long long> sum(0); //avem sum declarata ca long long atomic egala cu 0 //asta merge cu varianta cu atomic
  53. //end varianta2
  54. auto start = std::chrono::system_clock::now();//masurare timp
  55.  
  56. std::thread t1(sumUp,std::ref(sum),std::ref(randValues),0,firBound);//initializare th1...
  57. std::thread t2(sumUp,std::ref(sum),std::ref(randValues),firBound,secBound);
  58. std::thread t3(sumUp,std::ref(sum),std::ref(randValues),secBound,thiBound);
  59. std::thread t4(sumUp,std::ref(sum),std::ref(randValues),thiBound,fouBound);
  60.  
  61.  
  62. t1.join();//run th1..
  63. t2.join();
  64. t3.join();
  65. t4.join();
  66. std::chrono::duration<double> dur= std::chrono::system_clock::now() - start;//masurare timp end
  67. std::cout << "Time for addition " << dur.count() << " seconds" << std::endl;
  68. std::cout << "Result: " << sum << std::endl;
  69. for(int k=1;k<=size;k++)
  70. {
  71. std::cout<< randValues[k]<< ",";
  72. }
  73.  
  74. std::cout << std::endl;
  75. system("pause");
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement