Lamportov postupak međusobnog isključivanja

Zadatak

Ostvariti sustav paralelnih procesa/dretvi. Primjer strukture procesa, odnosno dretve dana je sljedećim pseudokodom:

Ostvariti program koji simulira tijek rezervacije stolova u nekom restoranu. Program na početku treba stvoriti određeni broj dretvi/procesa koji se zadaje u naredbenom retku. Svaka dretva/proces nakon isteka jedne sekunde provjerava ima li slobodnih stolova te slučajno odabire jedan od njih. Nakon odabira dretva ulazi u kritični odsječak te ponovo provjerava je li odabrani stol slobodan. Ako jest, označava stol zauzetim. U oba slučaja, nakon obavljene operacije ispisuje trenutno stanje svih stolova te podatke o obavljenoj rezervaciji. Prilikom ispisa za svaki stol mora biti vidljivo je li slobodan ili broj dretve/procesa koja je taj stol rezervirala. Broj stolova se također zadaje u naredbenom retku. Svaka dretva/proces ponavlja isti postupak sve dok više nema slobodnih stolova. Program završava kada sve dretve/procesi završe.

Primjer ispisa: (3 dretve, 5 stolova)

Dretva 1: odabirem stol 2
Dretva 2: odabirem stol 2
Dretva 3: odabirem stol 5
Dretva 2: rezerviram stol 2, stanje:
-2---
Dretva 1: neuspjela rezervacija stola 2, stanje:
-2---
Dretva 3: rezerviram stol 5, stanje:
-2--3
itd.

Zaštitu kritičnog odsječka postupka rezervacije stola ostvariti za više procesa/dretvi koristeći Lamportov algoritam međusobnog isključivanja.

Lamportov algoritam:

zajedničke varijable: TRAŽIM[0..n-1], BROJ[0..n-1]
funkcija uđi_u_kritični_odsječak(i)
{
   TRAŽIM[i] = 1
   BROJ[i] = max(BROJ[0],...,BROJ[n-1]) + 1
   TRAŽIM[i] = 0

   za j = 0 do n-1 čini
      dok je TRAŽIM[j] <> 0 čini
         ništa
      dok je BROJ[j] <> 0 && (BROJ[j] < BROJ[i] || (BROJ[j] == BROJ[i] && j < i)) čini
         ništa
}
 
funkcija izađi_iz_kritičnog_odsječka(i)
{
   BROJ[i] = 0
}

Upute:

Ako se program rješava s procesima tada treba zajedničke varijable tako organizirati da se prostor za njih zauzme odjednom i podijeli među njima. Ovo je nužno zbog ograničenog broja segmenata i velikog broja korisnika.