Thiff

Threads_merge_opposite

Nov 13th, 2017
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.62 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <windows.h>
  5.  
  6. #define TYP double
  7.  
  8. // funkce rand() je pouze 16 bitova
  9. // rand32 vraci 32 bitove nahodne cislo
  10. int rand32()
  11. {
  12.     return rand() * RAND_MAX + rand();
  13. }
  14.  
  15. // Pouziti globalnich promennych zjednodusuje ukazku pouziti vlaken.
  16. // Neni ovsem programatorsky spravne!
  17. // Globalni promenne: DELKA - pocet prvku na ktere odkazuje POLE
  18. int DELKA;
  19. TYP *POLE;
  20. // osobně ani nevím, proč jsem tam ty globálné proměné nechával, když jsem to stejně pak posílal přes parametry x)
  21. // vypocet casoveho intervalu v milisekundach
  22. int kolik_ms( LPFILETIME pred, LPFILETIME po )
  23. {
  24.     hyper pred64b = pred->dwHighDateTime;
  25.     pred64b = ( pred64b << 32 ) | pred->dwLowDateTime;
  26.     hyper po64b = po->dwHighDateTime;
  27.     po64b = ( po64b << 32 ) | po->dwLowDateTime;
  28.     // konverze 100ns -> 1ms
  29.     return ( int ) ( ( po64b - pred64b ) / 10000 );
  30. }
  31. void tiskP (void)
  32. {
  33.     // hned return nechci tisknout zrovna (stotisíc čísel vytisknout by dalo zabrat...  ato několikrát... x) - pro menší pole zakomentovat return... x)
  34.     return;
  35.     for (int i = 0; i < DELKA; i++)
  36.     {
  37.         printf("%4.2f\n", POLE[i]);
  38.     }
  39.     printf("---------------------------------------\n");
  40. }
  41. void bubleSort(int levy, int pravy, TYP *pole){
  42.     for(int i = 0; i < pravy-levy; i++){
  43.         for(int j = 0; j < pravy - i-levy-1; j++){
  44.             if(pole[j+1+levy] < pole[j+levy]){
  45.                 TYP tmp = pole[j + 1+levy];
  46.                 pole[j + 1+levy] = pole[j+levy];
  47.                 pole[j+levy] = tmp;
  48.             }
  49.         }
  50.         //tiskP();
  51.     }
  52. }
  53. typedef struct {
  54.     int Od;
  55.     int Do;
  56.     TYP *pole;
  57. } param;
  58.  
  59. DWORD WINAPI buble1( LPVOID s)
  60. {
  61.     printf( "Startuje vlakno buble1\n" );
  62.     //MAX2 = hledej_max( DELKA / 2, DELKA, POLE );
  63.     param *tmp = (param *)s;
  64.     bubleSort(tmp->Od, tmp->Do, tmp->pole);
  65.     return 0;
  66. }
  67.  
  68. void genArray(int levy, int pravy, TYP *pole){
  69.     int x = 0;
  70.     for (int i = levy; i < pravy; i++)
  71.     {
  72.         x = rand32()%100000;
  73.         pole[i] = (TYP)(x / 100.00);
  74.  
  75.     }
  76. }
  77.  
  78.  
  79. DWORD WINAPI genArray1( LPVOID s)
  80. {
  81.     printf( "Startuje vlakno gen1\n" );
  82.     //MAX2 = hledej_max( DELKA / 2, DELKA, POLE );
  83.     param *tmp = (param *)s;
  84.     genArray(tmp->Od, tmp->Do, tmp->pole);
  85.    
  86.     return 0;
  87. }
  88.  
  89. int main( int na, char **arg )
  90. {
  91.     DELKA = 100000;
  92.     POLE = new TYP[DELKA];
  93.  
  94.     param *s1 = new param;
  95.     param *s2 = new param;
  96.  
  97.     s1->Od = 0;
  98.     s1->Do = DELKA/2;
  99.     s1->pole = POLE;
  100.  
  101.     s2->Do = DELKA;
  102.     s2->Od = DELKA/2;
  103.     s2->pole = POLE;
  104.  
  105.     HANDLE v1, v2;
  106. //naplnění pole náhodnými čísly přes dvě vlákna
  107.     v1 = CreateThread( 0, 0, genArray1, s1, 0, 0 );
  108.     v2 = CreateThread( 0, 0, genArray1, s2, 0, 0 );
  109. //čekní na ukončení vláken
  110.     WaitForSingleObject( v1, INFINITE );
  111.     WaitForSingleObject( v2, INFINITE );
  112.  
  113.     tiskP();
  114.  
  115.     FILETIME cas_pred, cas_po;
  116. //měření čaasu... viz ukázka vláken....
  117.     GetSystemTimeAsFileTime ( &cas_pred );
  118.  
  119. //seřezování pole přes dvě vlákna bubblesortem - pro stotisíc čísel cca 14,5 sekund
  120.     v1 = CreateThread( 0, 0, buble1, s1, 0, 0 );
  121.     v2 = CreateThread( 0, 0, buble1, s2, 0, 0 );
  122.     WaitForSingleObject( v1, INFINITE );
  123.     WaitForSingleObject( v2, INFINITE );
  124.     GetSystemTimeAsFileTime( &cas_po );
  125. //konec meření času
  126.     tiskP();
  127.     printf( "Cas buble byl %d [ms]\n----------------------------\n", kolik_ms( &cas_pred, &cas_po ) );
  128.  
  129.     GetSystemTimeAsFileTime ( &cas_pred );
  130. //převracení pole
  131.     for (int i = 0; i < (int)(DELKA/2); i++)
  132.     {
  133.         TYP tmp = POLE[i];
  134.         POLE[i] = POLE[DELKA-1-i];
  135.         POLE[DELKA-1-i] = tmp;
  136.     }
  137.     GetSystemTimeAsFileTime( &cas_po );
  138.     tiskP();
  139.     printf( "Cas prevraceni byl %d [ms]\n----------------------------\n", kolik_ms( &cas_pred, &cas_po ) );
  140.  
  141. //spojení pole tak, aby bylo celé seřazené a né jen 1. půlka a pak 2.půlka...
  142.     TYP *tmp_p = new TYP[DELKA];
  143.     printf("ZACATEK SPOJOVANI\n");
  144.     int a = 0, b = DELKA/2;
  145.  
  146.     for (int i = 0; i < DELKA; i++)
  147.     {
  148.         if (a > DELKA/2) a = DELKA/2-1;
  149.         if (b > DELKA) b = DELKA -1;
  150.         if (POLE[a] > POLE[b])
  151.         {
  152.             tmp_p[i] = POLE[a];
  153.             a++;
  154.         }
  155.         else
  156.         {
  157.             tmp_p[i] = POLE[b];
  158.             b++;
  159.         }
  160.     }
  161.     delete []POLE;
  162.     POLE = tmp_p;
  163.     tiskP();
  164.     printf("KONEC SPOJOVANI\n");
  165.     s1->pole = POLE;
  166.     s2->pole = POLE;
  167.  
  168. //znova naplnění pole náhodnými čísly přes dvě vlákna
  169.     v1 = CreateThread( 0, 0, genArray1, s1, 0, 0 );
  170.     v2 = CreateThread( 0, 0, genArray1, s2, 0, 0 );
  171.     WaitForSingleObject( v1, INFINITE );
  172.     WaitForSingleObject( v2, INFINITE );
  173.     tiskP();
  174.  
  175. //nastavení struktury param s1 - od 0 do DELKA, na POLE
  176.     s1->Od = 0;
  177.     s1->Do = DELKA;
  178.     s1->pole = POLE;
  179. //zacatek mereni
  180.     GetSystemTimeAsFileTime ( &cas_pred );
  181. //serazeni pole pomocí jednoho vlákna  - pro stotisíc čísel cca 58 sekund
  182.     v1 = CreateThread( 0, 0, buble1, s1, 0, 0 );
  183.     WaitForSingleObject( v1, INFINITE );
  184.     GetSystemTimeAsFileTime( &cas_po );
  185.     tiskP();
  186.     printf( "Cas jedno vlakno byl %d [ms]\n----------------------------\n", kolik_ms( &cas_pred, &cas_po ) );
  187.  
  188. //uložení pole do textového souboru
  189.     FILE *p;
  190.     if ((p = fopen("out.txt", "w")) != NULL)
  191.     {
  192.     for (int i = 0; i < DELKA; i++)
  193.     {
  194.         fprintf(p,"%4.2f\n", POLE[i]);
  195.     }
  196.     fclose(p);
  197.     }
  198. // uvolnení využívané paměťi v hromadě.. nenechávame po sobě bordel přece
  199.     delete []POLE;
  200.     delete s1;
  201.     delete s2;
  202. }
Add Comment
Please, Sign In to add comment