ISU+Ov4

=Øvelse 4=

I øvelsen skal vi forsøge at lave hvores første program som har to tråde i en proces. dette gøres ved at vi laver en funktion der udskriver tråd ?, derefter ønsker vi at lave en main som kan håndtere dette og på skift udskrive to tråde. code const int NUM =2; void *thread_function(void *arg) {   int id = (int)arg; int i;   while (i< 10) {       printf("hello %d from tread %d \n", i,id); i++; sleep(1); }   pthread_exit(const_cast("thread exit")); } code I funktionen danner vi en print, der udskriver hello fra tråden som programmet er ved, Vilken tråd der udskrives bliver styret fra main, da vi operere med 2 tråede i samme proces. Print er pakket ind i en while løkke der køre 10 gange med 1 sekunds mellemrum. Vi vil se at main står og venter på at de forskellige tråde retunere. Main står og venter i pthread_join. code int main {   int res, threads; pthread_t thread[NUM]; void *thread_result;
 * Del1**

for (threads = 0; threads < NUM ; threads++) {       res = pthread_create(&(thread[threads]), NULL, thread_function, (void*)threads); if (res !=0 ) {           fprintf (stderr, "Thread %d creation failed", threads); exit(EXIT_FAILURE); }   }

for ( threads = 0; threads < NUM ; threads++) {       res = pthread_join(thread[threads], &thread_result); printf ("%s\n", (char*)thread_result); if (res != 0) {           fprintf (stderr, "Thread %d join failed", threads); exit(EXIT_FAILURE); }   } return 0; }

code I main oprettes der 2 forløkker, disse to forløkker bruger den ene funktion som vi har oprettet til at udskrive på skrift, sådan at vi får dannet 2 tråede.

De to tråde der oprettes er pthread_create disse tager argumenterne: NULL, funktion/koden tråden skal køre, ID(argument til tråden), pthread_t(tråden)

Alle tråde skal køre inde i en process. Man kan have flere processer men de tråde der er oprettet i en process kan kun fungere under denne. Dette vil også sige at hvis main retunere med det samme vil processen dø og dermed vil tråden/trådene også blive nedlagt. Vi skal derfor også nævne at en tråd ikke kan tilknyttes en selvstændig adresse rum men som nævnt så er den tilknyttet en process.
 * Hvad sker om main retunere med det samme:**


 * Del 2 Deling, Skrive og læse tråd**

I denne øvelse skal vi arbejde med at læse og skrive til en shared variable hvor både reader og incrementer skal tilgå denne. Vi skal udforske de problemer som opstår når vi har denne opstilling. code using namespace std;
 * 1) include
 * 2) include
 * 3) include 

unsigned int shared = 0;

void *incrementer(void *shared) {   int *sharedPtr =(int*) shared;

for (int i = 0; i < 10; ++i) {       (*sharedPtr)++; sleep(1); }   cout<<"Incrementer terminates"<<endl;

return NULL; }

void *reader(void *shared) {   int *sharedPtr = (int*) shared;

for (int i=0; i<10; ++i) {       cout<<"shared int is: "<<*sharedPtr<< endl; sleep(1);

}   cout<<"reader terminated"<<endl;

return NULL; }

code Når vi kører programmet ser vi at reader ind imellem læser samme værdi code int main {   pthread_t thread_inc, thread_reader;
 * Opstår der problemer:**

cout<<"Creating treads"<<endl;

pthread_create(&thread_inc, NULL, incrementer, (void*) &shared); cout<<"Incrementer creater"<<endl;

pthread_create(&thread_reader, NULL, reader, (void*) &shared); cout<<"Thread reader"<<endl;

pthread_join(thread_inc, NULL); pthread_join(thread_reader, NULL);

cout<<"main exit"<<endl; } code
 * Som vi så da vi kørte programmet så er vi ikke garanteret at reader tråden ikke bliver kørt to gange. Vi ville have forventet at incrementer havde kørt imellem. Vi kan altså ikke garantere at tråden bliver kørt efter plan.**

Når vi laver denne øvelse har Vector 10.000 elementer som vi kan sætte og teste med. Dette gøres ved brug af Vector::setAndTest code const int thread_number = 10; Vector vector1;
 * Del 3**

void* write(void* id) {   for(int i = 1; i< 101; i++) {       if(!vector1.setAndTest(i)) printf("Error found. Thread: %d, i: %d\n", (int)id, i); else printf("No Error found. Thread: %d, i: %d\n", (int)id, i);

usleep(1000000); }

pthread_exit(NULL); } code Detekterede fejl som opstår gradvidst med at antallet af tråde i programmet øges,

I programmet har vi den fejl at trådende deler vores vecor objekt og derfor kan de skrive til det samme memory område. Dett vil ofte kunne gie konflikter. Jo færre tråde vi arbejde med i programmet jo mindre ville dette problem være.

I denne del af øvelsen benyttes en modificeret udgave af programmet fra øvelse 3. Når vi vælger at øge antallet af tråde i programmet af vi flere som piller i samme memory område og derfor vil vi se at der opstår fejl. Om vi for at løse nogle problemer vælger at ligge en tråd til at sove vil samme problem opstå når den f.eks. vækkes for tidligt eller om tiden for dens sovende bliver mindsket.
 * Del 4**

Som i del 4 er koden den samme som den der blev benyttet i del 3 blot med nogle ændringer i og med at der ændres i to paramtre numer of threads og sleep.
 * Del5**

når vi tester på target opblever vi at fejlene opstår allerede ved hunrede tråede med 1 sekunds mellemrum. Vi kan derfor konsattere at vi ikke bør komme så langt op i tråede når vi skal lave program til target. Vi testede længere ned også og konstaterede at programmet kørte bedst ved 10 - 15 tråede.

code  code