Exercise+4.1

=Exercise 1= Vi har valgt at bruge mutex som semaphore til at løse problemet i exercise 3.2...

=Exercise 2= I denne opgave skal modificere opgave 3.4, med en semaphore,Vi gør det i 3.4, da den giver os flest fejl, og vi derfor lettere kan teste de to opgaver mod hinanden. Kort om Mutex:

Vi arbejder i Vector.h. Ved at gøre dette sikre vi os imod at der bliver oprettet andre funktioner, som benytter Vector.h's setAndGet funktion. Mutex beskyttelsen i Vector.h gør at 2 eller flere funktioner ikke ødelægger det for hinanden. Hvis vi havde lavet den direkte i writer-funktionen, og programmøren ikke havde været opmærksom på dette, vil det være muligt for andre funktioner at tilgå Vector.h funktioner og lave om på dataen. Dette er nu ikke muligt ved mutex beskyttelsen i Vector.h.

Følgende kode bliver sat ind, i Vector.h

code format="cpp" pthread_mutex_t mutex;                         //Bliver oprettet som privat data. int res;                                       //Bliver oprettet som privat data.

pthread_mutex_init(&mutex, NULL);              // Constructor

pthread_mutex_destroy(&mutex);                 // Destructor

// Den nye setAndTest(n), med mutex implementeret. bool setAndTest(int n)   { pthread_mutex_lock(&mutex);    // &mutex er adressen et ID nummer set(n); res = n;       pthread_mutex_unlock(&mutex);   // &mutex er adressen på et Id nummer return test(res);

}

code

=Exercise 3= I denne opgave skal vi opdatere programmet fra excercise 2, således at i stedet for at sætte mutex_lock og mutex_unlock omkring det vi vil have låst, i vores tilfælde setAndGet, laver vi en klasse, som håndtere låsningen for os. Dette betyder at mutex'en bliver sat i constructoren og "release" igen i destructoren. ScopedLocker bliver oprettet som en klasse, med følgende kode.

code
 * 1) include 

class ScopedLocker { public: ScopedLocker(pthread_mutex_t mutex) : scopMutex(mutex) { pthread_mutex_lock(&scopMutex); } ~ScopedLocker { pthread_mutex_unlock(&scopMutex); } private: pthread_mutex_t &scopMutex; }; code SetAndTest- funktionen i Vector.h, laves en smule om. code format="cpp" bool setAndTest(int n) { ScopedLocker sl (mutex); set(n); return test(n); } code Ved at benytte ScopedLocker-klassen sikrer man, at der automatisk bliver oprettet en mutex, da den er initialisere i constructoren, hver gang setAndTest-funktionen benyttes. Når funktionen forlades igen, bliver den oprettet mutex automatisk nedlagt, da den er initialisere i destroctoren. Hvis der i en funktion, hvor ScopedLocker-klassen blive brugt, oprettes mange funktionskald, skal man overveje sit brug af denne, da hele funktionen bliver lukket med mutex.