Advertisement
Guest User

No jest malloc i dalej wypierdala XD

a guest
Jan 15th, 2020
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.91 KB | None | 0 0
  1. // SO IS1 211A LAB05
  2. // Jakub Ogryzek
  3. // oj44443@zut.edu.pl
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <sys/types.h>
  8. #include <unistd.h>
  9. #include <sys/types.h>
  10. #include <windows.h>
  11.  
  12. HANDLE mutex;
  13.  
  14. float globalna_suma;
  15.  
  16. struct Struktura{
  17.     int size;
  18.     float* tab;
  19.     int tab_number;
  20.     int from;
  21.     int to;
  22. };
  23.  
  24. DWORD WINAPI thread(LPVOID argument)
  25. {  
  26.     struct Struktura *data = argument;
  27.     DWORD self = GetCurrentThreadId();
  28.     printf("%dThread #%lxd\tsize=%d\n",data->tab_number,self,data->size);
  29.     //Zliczanie sumy
  30.     float sum;
  31.     for (int i=data->from;i<data->to;i++)
  32.         sum=sum+data->tab[i];
  33.     printf("%dThread #%lxd\tsum=%f\n",data->tab_number,self,sum);
  34.  
  35.     //printf("%dTablica:",data->tab_number);
  36.     //for(int i=0;i<data->size;i++)
  37.         //printf("%f,",data->tab[i]);
  38.     //printf("\n");
  39.  
  40.     WaitForSingleObject(mutex,INFINITE);
  41.     //sekcja krytyczna
  42.     globalna_suma=globalna_suma+sum;
  43.     ReleaseMutex(mutex);
  44. }
  45.  
  46. int main(int argc, char *argv[])
  47. {
  48.     mutex = CreateMutex(NULL,FALSE,NULL);
  49.     if (argc != 3)
  50.     {
  51.         fprintf(stderr,"Error1\n");
  52.         exit(1);
  53.     }
  54.     int n = atoi(argv[1]);
  55.     int w = atoi(argv[2]);
  56.     if (n<0 || n>1000000)
  57.     {
  58.         fprintf(stderr,"Error2\n");
  59.         exit(2);
  60.     }
  61.     if (w<0 || w > n)
  62.     {
  63.         fprintf(stderr,"Error3\n");
  64.         exit(3);
  65.     }
  66.     float tab[n];
  67.     srand(0);
  68.     for (int i=0;i<n;i++)
  69.         tab[i]=1000.*rand()/RAND_MAX;
  70.  
  71.     //printf("Tablica: ");
  72.     //for(int i=0;i<n;i++)
  73.         //printf("%f\t",tab[i]);
  74.     //printf("\n");
  75.  
  76.     int modulo = n%w;
  77.     int division = n/w;
  78.     //float temp[division];
  79.     //float last_temp[division+modulo];
  80.     //struct Struktura Data_Tab[w];
  81.     struct Struktura *Data_Tab;
  82.     Data_Tab = (struct Struktura*) malloc(sizeof(struct Struktura)*w);
  83.     HANDLE threads[w];
  84.     DWORD thrdids[w];
  85.     if (w==1)
  86.     {
  87.         float last_temp[division+modulo];
  88.         for (int i=0;i<n;i++)
  89.             last_temp[i]=tab[i];
  90.         Data_Tab[0].size=n;
  91.         Data_Tab[0].tab=last_temp;
  92.         Data_Tab[0].tab_number=1;
  93.         Data_Tab[0].from=0;
  94.         Data_Tab[0].to=n;
  95.         threads[0] = CreateThread(NULL,0,thread,&Data_Tab[0],0,thrdids+0);
  96.         WaitForSingleObject(threads[0],INFINITE);
  97.         CloseHandle(threads[0]);
  98.     }
  99.     else
  100.     {
  101.         int j=0;
  102.         //t to skrot od Thread
  103.         int t=0;
  104.         while (t<w-1)
  105.         {
  106.             Data_Tab[t].size=division;
  107.             Data_Tab[t].tab=tab;
  108.             Data_Tab[t].tab_number=t+1;
  109.             Data_Tab[t].from=j;
  110.             j=j+division;
  111.             Data_Tab[t].to=j;
  112.             threads[t] = CreateThread(NULL,0,thread,&Data_Tab[t],0,thrdids+t);
  113.             t=t+1;
  114.         }
  115.         Data_Tab[t].size=division+modulo;
  116.         Data_Tab[t].tab=tab;
  117.         Data_Tab[t].tab_number=t+1;
  118.         Data_Tab[t].from=j;
  119.         j=j+division+modulo;
  120.         Data_Tab[t].to=j;
  121.         threads[t] = CreateThread(NULL,0,thread,&Data_Tab[t],0,thrdids+t);
  122.         t=t+1;
  123.         for(int a=0;a<w;a++)
  124.         {
  125.             WaitForSingleObject(threads[a],INFINITE);
  126.             CloseHandle(threads[a]);
  127.         }
  128.     }
  129.  
  130.     //Zliczanie sumy normalnie
  131.     float suma;
  132.     for (int i=0;i<n;i++)
  133.         suma=suma+tab[i];
  134.  
  135.  
  136.     printf("w/Threads:%f\n",globalna_suma);
  137.     printf("wo/Threads:%f\n",suma);
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement