Exercise+4.2

I opgave 4.2 skal vi lave software til et parkeringsanlæg. Der er i alt fire krav, disse krav vil blive implementeret løbende i opgaverne nedenunder. toc =Exercise 1= I denne opgave skal de første tre krav implementeres, som er. 1. Cars enter the parking lot, stay there for a while, and then exit the parking lot again. Then they wait a while before they re-enter the parking lot. 2. An arriving car must request permission to enter the parking lot from the PLCS entry guard. When permission is granted, the car may enter the parking lot. 3. An exiting car must request permission to exit the parking lot from the PLCS exit guard. When access is granted, the car may exit the parking lot.

Da der er tre aktører, har vi valgt at lave en tråd for hver af dem. Derfor opretter vi tre tråde. code format="cpp" // udenfor main void *Entry_gard(void *arg); void *Exit_gard(void *arg); void *Car(void *arg); code For at holde programmet simpelt til at starte med, skal det kun virke med en bil. Vi bruge binær-semaphore, til holde styr på trådende. De virker ved at de enten har værdien 0 og 1 (locked/unlocked). Hvis de har værdien 0 betyder det at de skal vente på en anden tråd, til at release dem, dette gøres ved at give dem værdien 1.

Vi har oprettet i alt seks semaphore, tre til entry og tre til exit. For at disse virker skal der inkluderes. code format="cpp" // udenfor main sem_t SemEntry_1, SemEntry_2, SemEntry_3, SemExit_1, SemExit_2, SemExit_3; code De oprettet semaphore overfor skal initialisere, dette gøres ved at bruge = = code // indenfor main int sem_init(sem_t *//sem//, int //pshared//, unsigned int //value//);

code //sem// er semaphores ID, i vores tilfælde de oprettet semaphore. Hvis // pshared // argumentet er nul, så bliver semaphoren delt mellem tråde i processen Hvis // pshared // argument har en ikke - nul værdi, så bliver semaphoren delt mellem processer //value// skal sættes til >=0

For at låse (lock) en semaphore bruges. code int sem_wait(sem_t *//sem//);

code //sem// er semaphores ID

For at låse op (unlock) en semaphore bruges. code int sem_post(sem_t *//sem//);

code //sem// er semaphores ID

pthread_create og pthread_join bliver brugt til at oprette og samle trådene, ligesom de er blevet i tidligere opgaver.

code format="cpp" void *Entry_gard(void *arg) {   while(true){ cout << "Entry 1. Entry guard venter på bil" << endl; sem_wait(&SemEntry_1); cout << "Entry Guard tjekker om der er plads" << endl; sem_wait(&counter); cout << "Entry 2. Der er kommet en bil. Åbner gate" << endl; sleep(2); sem_post(&SemEntry_2); cout << "Entry 3. Gate åben, venter på bil er inde" << endl; sem_wait(&SemEntry_3); cout << "Entry 4. Bil er inde, lukker gate" << endl; } } code

code format="cpp" void *Exit_gard(void *arg) {   while(true){ cout << "Exit 1. Exit guard venter på bil" << endl; sem_wait(&SemExit_1); cout << "Exit 2. Der er kommet en bil. Åbner gate" << endl; sleep(2); sem_post(&counter); sem_post(&SemExit_2); cout << "Exit 3. Gate åben, venter på bil er ude" << endl; sem_wait(&SemExit_3); cout << "Exit 4. Bil er ude, lukker gate" << endl; } } code

code format="cpp" void *Car(void *arg) {   while(true){

usleep(400); cout << "Car " << carId << " Bil kører frem, fortaeller om det" << endl; sem_post(&SemEntry_1); cout << "Car " << carId << " Bil requester entry" << endl; sem_wait(&SemEntry_2); cout << "Car " << carId << " Har fået lov - koerer ind" << endl; cout << "Car " << carId << " Er inde - fortaeller om det" << endl; sem_post(&SemEntry_3); cout << "Car " << carId << " Parkeret :)" << endl;

sleep(10); cout << "**********************" << endl;

cout << "Car " << carId << " _exit. Bil kører frem, fortaeller om det" << endl; sem_post(&SemExit_1); cout << "Car " << carId << " _exit. Bil requester exit" << endl; sem_wait(&SemExit_2); cout << "Car " << carId << " _exit. Har fået lov - koerer ud" << endl; cout << "Car " << carId << " _exit. Er ude - fortaeller om det" << endl; sem_post(&SemExit_3); cout << "Car " << carId << " _exit. Ude :)" << endl;

cout << endl << endl; } } code

=Exercise 2= Ligesom overfor skal de første tre krav opfyldes. Derudover skal anlægget kunne håndtere mere end en bil, dette gøres ved at sætte en for-løkke rundt om pthread_create. Ellers er koden den samme.

code format="cpp" for (int i = 0; i < SIZE; i++){ if (car_id = pthread_create(&bil[i], NULL, Car, NULL)) {       cout << "Thread creation failed: " << car_id << endl; } } code

=Exercise 3= I denne opgave tilførs et ekstra krav, som er. 4. The entry guard must not grant permission to access the parking lot until there is actually room for the entering car.

Dette gøres ved at lave en ekstra semaphore code format="cpp" sem_t counter; // id oprettes

sem_init(&counter, 0, 2); // initialisere code

Derudover oprettede vi et car_id, så vi kan kende forskel på bilerne. code format="cpp" int car_id[SIZE];

// Ny for-løkke, med pthread_create for (int i = 0; i < SIZE; i++){ car_id[i] = i;	if (carC = pthread_create(&bil[i], NULL, Car, &car_id[i])) } code For at dette er muligt er der i car sat følgende ind. code int carId = *(int*) (arg); cout << "car: " << carId << endl; code

I entry guard er følgende linje sat ind, efter sem_wait(&SemEntry_1); code format="cpp" cout << "Entry Guard tjekker om der er plads" << endl; sem_wait(&counter); code

I exit guard er følgende linje sat ind, efter sleep(2); code format="cpp" sem_post(&counter); code