Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // SO IS1 211A LAB05
- // Jakub Ogryzek
- // oj44443@zut.edu.pl
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <windows.h>
- HANDLE mutex;
- float globalna_suma;
- struct Struktura{
- int size;
- float* tab;
- int tab_number;
- int from;
- int to;
- };
- DWORD WINAPI thread(LPVOID argument)
- {
- struct Struktura *data = argument;
- DWORD self = GetCurrentThreadId();
- printf("%dThread #%lxd\tsize=%d\n",data->tab_number,self,data->size);
- //Zliczanie sumy
- float sum;
- for (int i=data->from;i<data->to;i++)
- sum=sum+data->tab[i];
- printf("%dThread #%lxd\tsum=%f\n",data->tab_number,self,sum);
- //printf("%dTablica:",data->tab_number);
- //for(int i=0;i<data->size;i++)
- //printf("%f,",data->tab[i]);
- //printf("\n");
- WaitForSingleObject(mutex,INFINITE);
- //sekcja krytyczna
- globalna_suma=globalna_suma+sum;
- ReleaseMutex(mutex);
- }
- int main(int argc, char *argv[])
- {
- mutex = CreateMutex(NULL,FALSE,NULL);
- if (argc != 3)
- {
- fprintf(stderr,"Error1\n");
- exit(1);
- }
- int n = atoi(argv[1]);
- int w = atoi(argv[2]);
- if (n<0 || n>1000000)
- {
- fprintf(stderr,"Error2\n");
- exit(2);
- }
- if (w<0 || w > n)
- {
- fprintf(stderr,"Error3\n");
- exit(3);
- }
- float tab[n];
- srand(0);
- for (int i=0;i<n;i++)
- tab[i]=1000.*rand()/RAND_MAX;
- //printf("Tablica: ");
- //for(int i=0;i<n;i++)
- //printf("%f\t",tab[i]);
- //printf("\n");
- int modulo = n%w;
- int division = n/w;
- //float temp[division];
- //float last_temp[division+modulo];
- //struct Struktura Data_Tab[w];
- struct Struktura *Data_Tab;
- Data_Tab = (struct Struktura*) malloc(sizeof(struct Struktura)*w);
- HANDLE threads[w];
- DWORD thrdids[w];
- if (w==1)
- {
- float last_temp[division+modulo];
- for (int i=0;i<n;i++)
- last_temp[i]=tab[i];
- Data_Tab[0].size=n;
- Data_Tab[0].tab=last_temp;
- Data_Tab[0].tab_number=1;
- Data_Tab[0].from=0;
- Data_Tab[0].to=n;
- threads[0] = CreateThread(NULL,0,thread,&Data_Tab[0],0,thrdids+0);
- WaitForSingleObject(threads[0],INFINITE);
- CloseHandle(threads[0]);
- }
- else
- {
- int j=0;
- //t to skrot od Thread
- int t=0;
- while (t<w-1)
- {
- Data_Tab[t].size=division;
- Data_Tab[t].tab=tab;
- Data_Tab[t].tab_number=t+1;
- Data_Tab[t].from=j;
- j=j+division;
- Data_Tab[t].to=j;
- threads[t] = CreateThread(NULL,0,thread,&Data_Tab[t],0,thrdids+t);
- t=t+1;
- }
- Data_Tab[t].size=division+modulo;
- Data_Tab[t].tab=tab;
- Data_Tab[t].tab_number=t+1;
- Data_Tab[t].from=j;
- j=j+division+modulo;
- Data_Tab[t].to=j;
- threads[t] = CreateThread(NULL,0,thread,&Data_Tab[t],0,thrdids+t);
- t=t+1;
- for(int a=0;a<w;a++)
- {
- WaitForSingleObject(threads[a],INFINITE);
- CloseHandle(threads[a]);
- }
- }
- //Zliczanie sumy normalnie
- float suma;
- for (int i=0;i<n;i++)
- suma=suma+tab[i];
- printf("w/Threads:%f\n",globalna_suma);
- printf("wo/Threads:%f\n",suma);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement