Advertisement
Thiff

Podivat se

Nov 6th, 2017
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.65 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <sys/time.h>
  5. #include <sys/param.h>
  6. #include <pthread.h>
  7. #include <iostream>
  8.  
  9. #define TYPE int
  10.  
  11. using namespace std;
  12.  
  13. const int POCET_VLAKEN = 3;  //konstanta
  14. const int POCET_CISEL = 30;  //konstanta
  15.  
  16. struct structThread{         //struktura
  17.     int id;                     //název vlákna id
  18.     int from;
  19.     int to;
  20.     TYPE *data;             //pointer na pùvodní pole, které budeme tøídit
  21. };
  22.  
  23. int timeval_to_ms(timeval *before, timeval *after);
  24. void fillArrayRandom(TYPE *cisla, int velikostPole);
  25. void vypisPole(TYPE *cisla, int velikostPole);
  26. void bubbleSort(TYPE *cisla, int zacatek, int konec);
  27. void *vlaknoTrideni( void *void_arg );
  28. void *vlaknoPlneni(void *void_arg);
  29.  
  30.  
  31. int main(){
  32.     pthread_t vlaknoId[POCET_VLAKEN];           //vytvoøíme si pole vláken
  33.     pthread_t naplnPole;                        //vlákno plnìní pole
  34.     structThread vlaknoStruct[POCET_VLAKEN];    //vytvoøíme pole struktur pro vlákna, pro kažé vlákno potøebujeme svoji strukturu
  35.     TYPE velkePole[POCET_CISEL];                //poèáteèní pole, které se naplnìní random èísly
  36.     TYPE vyslednePole[POCET_CISEL];             // vysledne pole
  37.     timeval casPred,casPo;                      // èasové promnìné
  38.  
  39.     //naplneni a synchronizace
  40.     pthread_create( &naplnPole, NULL, vlaknoPlneni, &velkePole);    //vytvoøíme vlákno, které naplní pole
  41.     pthread_join(naplnPole, NULL );                                 //poèkáme na dokonèení vlákna
  42.  
  43.     //predani parametru srukture
  44.     for (int i = 0; i < POCET_VLAKEN; i++){                 //vymezení èásti velkého pole, které setøídí jedno vlákno
  45.         vlaknoStruct[i].id = i;                         //identifikace vlákna
  46.         vlaknoStruct[i].data = velkePole;               //data, které bude vlákno zpracovávat
  47.         vlaknoStruct[i].from = i * (POCET_CISEL/POCET_VLAKEN);                      //tøídìní od
  48.         vlaknoStruct[i].to = vlaknoStruct[i].from + (POCET_CISEL/POCET_VLAKEN);        //tøídìní do, vypoèítáme kolik èísel pøijde na jedno vlákno
  49.     }
  50.  
  51.     // trideni
  52.     gettimeofday( &casPred, NULL );      //zmeøení èasu na zaèátku, pak se uloží do caspPred
  53.     for (int i = 0; i < POCET_VLAKEN; i++){     //pustí všechny vlákna najednou 0-3
  54.         pthread_create( &vlaknoId[i], NULL, vlaknoTrideni, &vlaknoStruct[i] );  //spuštìní vlákna, Null, pøiøadíme funkci, a jeden parametr funkce, opakovanì pro další vlákno
  55.     }
  56.     // synchronizacia jednotlivych vlakien
  57.     for (int i = 0; i < POCET_VLAKEN; i++){
  58.         pthread_join( vlaknoId[i], NULL );          //èekáme až všechny vlákna skonèí
  59.     }
  60.  
  61.     cout<<"Pole pred:"<<endl;
  62.     vypisPole(velkePole, POCET_CISEL);
  63.     int counter = 0;       //index ukladaneho prvku do noveho pole
  64.     while(true){
  65.         TYPE minPrvek;      //promnìná pro minimální prvek
  66.         int indexMin;       //index èásti pole, kde jsme sebrali nejmenší prvek
  67.         int pocetProhledenych = 0;     //
  68.         //prvni minimum
  69.         for(int i = 0; i < POCET_VLAKEN; i++){      //zachycení první minimun
  70.             if(vlaknoStruct[i].from < vlaknoStruct[i].to){  //  jestli èást ještì mùžeme prohlédávat
  71.                 minPrvek = vlaknoStruct[i].data[vlaknoStruct[i].from]; //zachytíme si hodnotu minimálního prvku
  72.                 indexMin = i; //zachytíme si èást pole, odkud jsme sebrali nejmenší prvek
  73.                 break;
  74.             }
  75.         }
  76.  
  77.         //celkove minimum
  78.         for(int i = 0; i < POCET_VLAKEN; i++){          //prohledáme všechny èásti
  79.             if(vlaknoStruct[i].from < vlaknoStruct[i].to){      //které se dají prohledat
  80.                 if(vlaknoStruct[i].data[vlaknoStruct[i].from] < minPrvek){      //chytíme si hodnotu nejmenší prvku v jedné èásti a porovnáme s aktuálním min.prvkem
  81.                     minPrvek = vlaknoStruct[i].data[vlaknoStruct[i].from];      //zachytíme si nový minimální prvek a èást z kama jsme ho vzali
  82.                     indexMin = i;
  83.                 }
  84.                 pocetProhledanych++;        //zachytíme poèet prohledaných èástí
  85.             }
  86.         }
  87.         //naplneni noveho pole
  88.         vlaknoStruct[indexMin].from +=1;  //posunutí indexu from v èásti pole, z kama jsme sebrali minimum
  89.         vyslednePole[counter] = minPrvek; //do vysledneho pole na index counter zapíšeme ten minimální prvek
  90.         counter++;                          //counter si zvìtším o jednu pozici, na kterou budeme zapisovat další èíslo
  91.         if(pocetProhledenych == 0){       //pokud jsme neprohledali žádnou èást, cyklus konèí
  92.             break;
  93.         }
  94.  
  95.     }
  96.     gettimeofday( &casPo, NULL );           //zachytíme èas po setøídení
  97.     cout<<"The sort time: "<< timeval_to_ms( &casPred, &casPo )<<"[ms]"<<endl; //vypíšeme èas tøídìní
  98.  
  99.     cout<<"Pole po:"<<endl;
  100.     vypisPole(vyslednePole, POCET_CISEL);
  101.     return 0;
  102. }
  103.  
  104. void fillArrayRandom(TYPE *cisla, int velikostPole){    //naplnìní pole random èísly
  105.     srand((int)time(NULL));
  106.     for (int i = 0; i < velikostPole; i++){
  107.         cisla[i] = (rand() % 1000 +1 );
  108.  
  109.     }
  110. }
  111.  
  112. void bubbleSort(TYPE *cisla, int zacatek, int konec){   // pøedáme velké pole a vymezíme èas, kteýrm budeme tøídít
  113.         for(int i = zacatek; i < konec; i++){
  114.             for(int j = zacatek; j < konec - 1; j++){
  115.                 if(cisla[j] > cisla[j+1]){
  116.                     TYPE pom = cisla[j+1];
  117.                     cisla[j+1] = cisla[j];
  118.                     cisla[j] = pom;
  119.             }
  120.         }
  121.     }
  122. }
  123.  
  124. void *vlaknoPlneni(void *void_arg){
  125.     TYPE *ptr_data = ( TYPE * ) void_arg;       //pøetypování parametru funkce ptr_data je název pole, který se pøetypuje na TYPE*
  126.     fillArrayRandom(ptr_data,POCET_CISEL);      //funkce fill ArarayRandom potøebuje znát dva parametry, pole na plnìní, a jeho velikost
  127. }
  128.  
  129. void *vlaknoTrideni( void *void_arg ){              //funkce tøídìní dostane argument typu void
  130.     structThread *ptr_data = ( structThread * ) void_arg;       //pøetypování ptr_data na structThread
  131.     cout<<ptr_data->id<<" "<<ptr_data->from<<" "<<ptr_data->to<<endl;       //vypíše id vlákna, od, do
  132.     bubbleSort(ptr_data->data, ptr_data->from, ptr_data->to);   //posíláme bubble sortu pole, index od, index do
  133. }
  134.  
  135. void vypisPole(TYPE *cisla, int velikostPole){
  136.     cout<<"Vypis pole: "<<endl;
  137.     for (int i = 0; i < velikostPole; i++){
  138.         cout<<" "<<cisla[i];
  139.     }
  140.     cout<<endl;
  141.     cout<<"Konec vypisu pole"<<endl;
  142. }
  143.  
  144.  
  145. int timeval_to_ms(timeval *before, timeval *after){
  146.     timeval res;
  147.     timersub( after, before, &res );
  148.     return 1000 * res.tv_sec + res.tv_usec / 1000;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement