WOJSKOWA AKADEMIA TECHNICZNA
LABORATORIUM SYSTEMÓW OPERACYJNYCH Laboratorium nr 7 |
||||
Grupa |
I9X2S1 |
|||
Lp. |
Nazwisko i Imię |
Data wykonania ćwiczenia |
31.03.2011 |
|
1.
|
Bereźnicka Urszula |
Prowadzący ćwiczenie |
dr inż. Zbigniew Zieliński |
|
|
|
Ocena sprawozdania |
|
Treść zadania.
Napisać wielowątkowy program przyjmujący tylko parzystą liczbę argumentów, w przypadku nieparzystej ilości argumentów wyświetla komunikat „Błędna ilość argumentów”. Program ma wyliczać sumę argumentów podniesionych do kwadratu.
Kod programu.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define MAX 30
struct dane{
int a;
int b;
};
struct dane arg[MAX];
int zlicz(char *n, char **s){
char *c;
int i=0;
c=strtok(n," ");
while(c!=NULL && i<(MAX-1)){
s[i]=c;
c=strtok(NULL," ");
i++;
}
s[i]=NULL;
return i;
}
int oblicz(void* argg){
int a, b, tmp1, tmp2;
struct dane *x;
x = (struct dane *) argg;
a = x->a;
b = x->b;
tmp1 = (a*a);
tmp2 = (b*b);
printf("\nWatek o id %d: %d^2 + %d^2 = %d.\n", (int)pthread_self(), a, b, (tmp1+tmp2));
return (tmp1+tmp2);
}
int main(int argc, char **argv){
char watek[50];
char *w[MAX];
int i, j, tmp1, tmp2, l1, l2, suma;
while(1){
write(1,"progr>",7);
i=read(0, watek, 50-1);
if(i==0)
break;
watek[i]=0;
if(watek[i-1]=='\n')
watek[i-1]=0;
j=zlicz(watek, w);
if(strcmp(w[0],"exit")==0){
return 0;
}
if(j>=1){
if((j%2)==0){
suma=0;
int *argumenty = calloc((j/2),sizeof(int));
pthread_t t[j];
for(l1=0,l2=0;l1<(j/2);l1++,l2+=2){
arg[l1].a = atoi(w[l2]);
arg[l1].b = atoi(w[l2+1]);
pthread_create(&t[l1],NULL,(void*)oblicz,&arg[l1]);
}
for(l1=0;l1<(j/2);l1++){
pthread_join(t[l1],(void*)&argumenty[l1]);
suma+=argumenty[l1];
}
printf("\n\nSuma wynosi: %d\n\n", suma);
}
else
printf("Podano nieparzysta liczbe argumentow!\n");
}
}
return 0;
}
Podsumowanie.
Zgodnie z założeniami program przekazuje do funkcji tworzącej dany wątek po 2 argumenty. Każdy z argumentów jest podnoszony do kwadratu, a następnie oba są sumowane i przekazywane na zewnątrz funkcji obliczającej.
pthread_create(&t[l1], NULL, (void*)oblicz,&arg[l1]);
NULL oznacza, że zostały użyte domyślne wartości
oblicz jest to funkcja obliczająca kwadraty argumentów
arg[l1] są to argumenty podawane do funkcji oblicz
pthread_self();
Funkcja ta zwraca identyfikator wątku, który ją wywołał.
pthread_join(t[l1],(void *)&argumenty[l1]);
Wątek, który wywołuje tę funkcję zostaje wstyrzymany do chwili, gdy wskazany wątek zakończy działanie, wtedy wątek, który oczekiwał będzie kontynuowany. Pthread_join przekazuje wartość wynikową zwróconą przez wątek.
t[l1] wskazanie na wątek, na którego zakończenie czekamy
&argumenty wskazanie na wartość wynikową wątku