Exercise+3.2

=Exercise 1= toc I opgave 1 skal vi skrive et program med to tråde, main'en skal udskrive "Hello # from thread " med et sekund mellemrum, og udskrive det 10 gange i alt. Vi har valgt at skrive koden i gedit. Koden er både blevet testet på host og target, og er blevet kompileret ved hjælp af Host = "g++ -o host - lpthread thread.cpp" Target = "arm-none-linux-gnueabi-g++ -o target - lpthread thread.cpp"

vi bruger lpthread for at inkludere biblioteket pthread.h når vi kompiler og linker

Vi har brugt ref. 1som inspiration til udarbejdelse af vores program, da den er simpel og beskrivende for begyndere. Derudover har vi brugt ref. 2 (man-side) til at søge på de enkelt funktioner som pthread indeholder.

code format="cpp"
 * 1) include
 * 2) include "pthread.h"

using namespace std;

void *hello(void *arg);

int main {   pthread_t id0; pthread_t id1;

char message1 []= "Thread 0"; char message2 []= "Thread 1";

int id_ref0; int id_ref1;

void *thread_result;

cout << "Creating threads" << endl; cout << "Waiting for threads to finish" << endl;

/* Create independent threads each of which will execute function */

id_ref0 = pthread_create(&id0, NULL, hello, (void *)message1); id_ref1 = pthread_create(&id1, NULL, hello, (void *)message2);

/* Wait till threads are complete before main continues. */

pthread_join(id0, NULL); pthread_join(id1, NULL);

cout << "Exiting" << endl; }

void *hello(void *arg) {   bool tid = true; int counter = 0;

char *message; message = (char *) arg;

while(tid == true) {       cout << "Hello # " << counter << " from " << message << endl; counter++; sleep(1); if (counter == 10) tid = false; }   cout << message << " terminates" << endl; } code

Hvis man ikke bruger pthread_join afslutter mainen og derfor også trådene. Det vil sige at main skal vente på de er færdige, og derfor er det vigtig at huske pthread_join som gør at main først kalder dem tilbage når de er eksekveret.



ref. 1 = http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html ref. 2 = http://www.kernel.org/doc/man-pages/index.html

=Exercise 2= I opgave 2 skal vi lave et lille program som opretter to tråde, med en funktion som incrementer og en funktion som reader. der skal være en global variabel, som incrementer tæller op og som reader derefter læser. grunden til den skal være global er at, de begge skal kunne tilgå variablen shared. code format="cpp" unsigned int shared = 0;
 * incrementer || --->shared---> || reader ||

void *incrementer(void *arg); void *reader(void *arg);

int main { // Vores main er stort set den samme som i exercise 1, derfor er den ikke med. }

void *incrementer(void *arg) {   while (true) { cout << "plus" << endl; shared++; sleep(1); } }

void *reader(void *arg) {   while (true){ cout << "Tal: " << shared << endl; sleep(1); } } code

Vi så ingen fejl under test af programmet, men vi kunne forstille os at der kan opstå fejl, hvis den ene tråd bliver afviklet inden den anden er færdig.

=Exercise 3= I opgave 3 skal vi bruge klassen vector.h, som ligger på campusnet. Vi har oprettet en funktion "void *writer (void *arg);" som bruger funktionen "vector::setAndTest(int n)" til at test om en af de oprettet tråde fejler. Hvis "writer" fejler skal den returnere en fejl, og programmet vil udskrive at der er en fejl.

code format="cpp" void *writer(void *arg) {    bool status = true;

for(int i = 0; i < 10; i++ ) {           status = vec.setAndTest((long)arg); if (!status) cout << "Fejl i #" << (long)arg << endl; sleep(1); }       pthread_exit(NULL); } code hvis for-løkken ikke bliver oprettet, køre den kun writer igennem en gang, dette gir umiddelbart ingen fejl og vi har der for sat for-løkke ind i writer for at lave flere test, og derved er chancen for fejl større.

Når programmet eksekverede, var der stor forskel på, hvor mange fejl der opstod i forhold til hvor mange tråde der blev oprettet. Grunden til der kan forekomme fejl, kan være at vores pc køre en masse andre processer og at de, også skal have processer tid.

=Exercise 4= I denne opgave skal vi genbruge vores program fra øvelse 3, og modificere det lidt. Vi skal blandt andet implementere en bruger defineret tidsramme, målt i micro sekunder. Vi har brugt struct til at løse dette med. Det har vi gjort da struct gør det muligt at overfører to variabler fra over til. Struct bruges til at erklære en ny data - type. Dybest set betyder dette, en gruppe af variabler samlet.

code format="cpp" struct S { int arg;  // id    int us_tid;  // tiden }; code For at tilgå "arg" og "us_tid" i "writer" bruges følgende kode: S struc2 = *((S*)arg); Herved kan vi få adgang til struc2.arg og struc2.us_tid

Ved længere delay ses det at programmet genererer færre fejl. Dette kan muligvis skyldes at der er længere tid mellem trådende der kører og at processoren derfor bedre kan følge med, når der også køre andre processer.

Vi har en del problemer med hvor mange tråde vi må oprette, dette kan skyldes at vores program ikke for tildelt nok hukommelse, og at vores PC er hurtig. Den giver en "segmentation fault", men har fundet ud af at den kan køre ved 380 tråde og med 100 gentagelser