Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <atomic>
- #include <chrono>
- #include <iostream>
- #include <random>
- #include <thread>
- #include <utility>
- #include <vector>
- #include <mutex>
- constexpr long long size= 100000; //size elemente pt suma
- constexpr long long firBound= 2500;
- constexpr long long secBound= 5000;
- constexpr long long thiBound= 7500;
- constexpr long long fouBound= 10000;
- constexpr long long firBound1= 5000;//in caz ca se vor doar 2 th
- constexpr long long secBound1= 10000;//in caz ca se vor doar 2 th
- //var1
- std::mutex myMutex;//protejeaza resursele shared sa fie accesate simultan de mai multe th
- void sumUp(unsigned long long& sum, const std::vector<int>& val, unsigned long long beg, unsigned long long end){
- for (auto it= beg; it < end; ++it){
- std::lock_guard<std::mutex> myLock(myMutex);
- sum+= val[it];
- }//aici se face suma propriu zisa
- }
- //end varianta1
- //varianta2 mai rapida ca si unu dar se poate folosi oricare
- //la atomic nu mai este necesara protectia resurselor partajate fiindca deja avem int care e element atomic si care nu poate fi shared
- /*void sumUp(std::atomic<unsigned long long>& sum, const std::vector<int>& val, unsigned long long beg, unsigned long long end){
- for (auto it= beg; it < end; ++it){
- sum+= val[it];
- }
- }*/
- //end varianta2
- int main(){
- std::cout << std::endl;
- std::vector<int> randValues;
- randValues.reserve(size);
- std::mt19937 engine; //generator pseudo random
- std::uniform_int_distribution<> uniformDist(1,10);//distributia de la 1 la 10
- for ( long long i=0 ; i< size ; ++i) randValues.push_back(uniformDist(engine));//efectiv generarea vectorului
- //var1
- unsigned long long sum= 0; //asta merge cu mutex ->se declara variabila sum long long egal cu 0
- //end var1
- //varianta2
- //std::atomic<unsigned long long> sum(0); //avem sum declarata ca long long atomic egala cu 0 //asta merge cu varianta cu atomic
- //end varianta2
- auto start = std::chrono::system_clock::now();//masurare timp
- std::thread t1(sumUp,std::ref(sum),std::ref(randValues),0,firBound);//initializare th1...
- std::thread t2(sumUp,std::ref(sum),std::ref(randValues),firBound,secBound);
- std::thread t3(sumUp,std::ref(sum),std::ref(randValues),secBound,thiBound);
- std::thread t4(sumUp,std::ref(sum),std::ref(randValues),thiBound,fouBound);
- t1.join();//run th1..
- t2.join();
- t3.join();
- t4.join();
- std::chrono::duration<double> dur= std::chrono::system_clock::now() - start;//masurare timp end
- std::cout << "Time for addition " << dur.count() << " seconds" << std::endl;
- std::cout << "Result: " << sum << std::endl;
- for(int k=1;k<=size;k++)
- {
- std::cout<< randValues[k]<< ",";
- }
- std::cout << std::endl;
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement