Dekkerov postupak međusobnog isključivanja

Zadatak

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

proces proc(i)          /* i  [0..n-1] */
{
   za k = 1 do 5 čini {
      uđi u kritični odsječak
      za m = 1 do 5 čini {
          ispiši (i, k, m)
      }
      izađi iz kritičnog odsječka
   }
}

Umjesto navedenog primjera moguće je ostvariti bilo koji drugi primjer međusobnog isključivanja procesa, odnosno dretvi.

Međusobno isključivanje ostvariti za dva procesa/dretve međusobnim isključivanjem po Dekkerovom algoritmu.

Dekkerov algoritam:

zajedničke varijable: PRAVO, ZASTAVICA[0..1]
 
funkcija uđi_u_kritični_odsječak(i,j)
{
   ZASTAVICA[i] = 1
   dok je ZASTAVICA[j]<>0 čini {
      ako je PRAVO==j onda {
         ZASTAVICA[i] = 0
         dok je PRAVO==j čini {
            ništa
         }
         ZASTAVICA[i] = 1
      }
   }
}
 
funkcija izađi_iz_kritičnog_odsječka(i,j)
{
   PRAVO = j
   ZASTAVICA[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.

Ovisno o opterećenju računala i broju procesa koji se pokreću, a da bi se vidjele razlike prilikom izvođenja programa može biti potrebno usporiti izvršavanje sa:

sleep(1);

nakon: ispisi (i, k, m).

Primjer ispisa:

pinus:~/vj3> ./a.out
Dretva: 1, K.O. br: 1 (1/5)
Dretva: 1, K.O. br: 1 (2/5)
Dretva: 1, K.O. br: 1 (3/5)
Dretva: 1, K.O. br: 1 (4/5)
Dretva: 1, K.O. br: 1 (5/5)
Dretva: 2, K.O. br: 1 (1/5)
Dretva: 2, K.O. br: 1 (2/5)
Dretva: 2, K.O. br: 1 (3/5)
Dretva: 2, K.O. br: 1 (4/5)
Dretva: 2, K.O. br: 1 (5/5)
Dretva: 1, K.O. br: 2 (1/5)
Dretva: 1, K.O. br: 2 (2/5)
Dretva: 1, K.O. br: 2 (3/5)
Dretva: 1, K.O. br: 2 (4/5)
Dretva: 1, K.O. br: 2 (5/5)
Dretva: 2, K.O. br: 2 (1/5)
Dretva: 2, K.O. br: 1 (2/5)
itd.