I3MUP1+-+Exercise+3.2

=Exercise 3.2=

Øvelse 1:
//Write a program that creates two threads. When created, the threads must be passed an ID which they will print to stdout every second along with the number of times the thread has printed to stdout. When the threads have written to stdout 10 times each, they shall terminate. The main function must wait for the two threads to terminate before conmtinuing (hint:; Look up pthread_join).//

I filen inkludere vi bibliotekerne  og , da det giver mulighed for at lave tråde og benytte funktionen sleep. Herefter oprettes diverse variabler:



Disse variabler gør det herefter muligt at oprette 2 tråde, med et id nr. til hver



Dette gøres to gange, og derved har vi skabt to tråde som kører samtidig med "hovedtråden" hvor main kører. Da vi skal sikre os at main ikke lukker inden de andre er færdige benytter vi funktionen: pthread_join som gør at main venter på de andre tråde:

Før den sidste cout bliver udskrevet er de to tråde færdiggjort.

Hovedtråden bliver lukket, og programmet terminere derfor.
 * What happens if main returns immediately after creating the threads? Why?**

Øvelse 2:
//Create a program that creates two threads, incrementer and reader. The two threads share an unsigned integer variable shared which is initially 0. incrementer increments shared every second while reader reads it every second and outputs it to stdout.//

Vi kan sådan næsten benytte den samme main tråd som fra sidste opgave. Forskellen er at begge tråde nu deler en variabel, som vi sender med som parameter. Vi vil derfor kun vise de to funktioner:



Reader udskriver variablens værdi hvorefter der er pause på et sekund.



Incrementer tæller variablen en op hvorefter der er pause på et sekund.

Vi har ingen sikkerhed for at shared bliver inkrementeret inden det bliver læst. Der er ingen garanti for at reader når at læse shared 2 gange inden inkrementer når at inkrementere shared. Det kan f.eks. ses hvis man fjerner sleep(1) i de to funktioner og stadig køre den 10 gange. Der vil programmet nå at udskrive shared 10 gange, inden at den er blevet inkrementeret.
 * Are there any problems in this program? Do you see any? Why (not)?**

Øvelse 3:
//Create a thread functions: writer that uses Vector::setAndTest to set and test the value of a shared Vector object. Then create a main function that creates a user-defined number of writer threads (between 1 and 100), each with their own unique ID. Let each writer set and test the shared Vector object to its ID every second. If a writer detects an inconsistency in the shared Vector object (i.e. setAndTest returns false), it should write an error message.//

Da alle vores tråde skal tilgå samme vektor objekt, valgte vi at oprette den som et globalt objekt. Herefter lavede vi funktionen som læste og satte Vektorens indexes til trådens ID nr.



I vores main skal det være muligt for brugeren at skrive hvor mange tråde der skal køre, så vores main starter med at spørge om hvor mange tråde der skal køres.



Da der er nu er flere tråde der kører skal der køre lige mange pthread_join som der er tråde kørende:



Der sker fejl nogle gange især på target. Men det kræver at der oprettes utrolig mange tråde (100+), og det sker oftere at programmet kører fejlfrit.

Øvelse 4:
//Modify your program from exercise 3 so that the writers loop time is no longer one second but a userdefined number of microseconds. Experiment with the number of writers created and shorter loop time – do you see any problems? Explain when and why they start to occur, and why you did not see them in exercise 3. Also test on target – is there any difference in when you see errors on host and targets?//

Forskellen på øvelse 3 og 4 er at der nu er mulighed for at skrive ind antal gentagelser, hvor lang pause hver eneste tråd og hvor mange tråde der skal oprettes. Da alt det her skal sendes til alle tråde valgte vi at oprette det i en struct, og lave den global. Vi startede med at lave structen, da vi tænkte det skulle være muligt at sende flere variabler over til hver tråd, men dette skabte diverse problemer, så vi valgte at lave variablerne globale, så det kun var et id nr vi sendte til hver tråd:



Funktionen som kaldes ser således ud:

Det var tydeligt da man kørte programmet opstod der mange flere fejl, da man valgte samme antal tråde, samme antal gentagelser men med en korte pause.

EKSEMPEL PÅ FEJL: