Advertisement
varden

OR2 2016 T1 - Monitory

Jan 29th, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.47 KB | None | 0 0
  1. int ileDzieci[N] = {0, ..., 0}
  2. int idRodzica[N] = {-1, ..., -1}
  3. int ileProcesow = 1
  4. cond nieMaDzieci[N];
  5.  
  6. int NARODZINY(m){
  7.     int idDziecka;
  8.    
  9.     if(ileProcesow == N)
  10.         return -1
  11.    
  12.     //znajdź miejsce w tablicy, gdzie idRodzica == -1
  13.     //pomijamy 0wy proces
  14.     for(int i = 1, i < N, i++){
  15.         if (i != -1){
  16.             idDziecka = i;
  17.             break
  18.         }      
  19.     }
  20.    
  21.     utwórz(idDziecka);
  22.     ileProcesow++;
  23.     idRodzica[idDziecka] = m;
  24.     ileDzieci[m]++;
  25.    
  26.     return idDziecka
  27. }
  28.  
  29. void ŚMIERĆ(m){
  30.     if(m > 0){ //0wego nie zabijamy
  31.    
  32.         //zapamietajmy id rodzica zanim je zresetujemy, przyda sie
  33.         int idMojegoRodzica = idRodzica[m];
  34.        
  35.         if(ileDzieci[m] > 0){
  36.             wait(nieMaDzieci[m]);
  37.         }
  38.         /*
  39.             tu NIE MA ELSE'A!
  40.             wykonywany jest kod po ifie nawet jak wszedl w if!
  41.             jak juz wznowimy signalem tego waita wyzej, to chcemy zeby ten proces
  42.             poprawnie sie zabil dalsza czescia tego kodu,
  43.             a nie zeby opuscil funkcje ŚMIERĆ bez zabijania sie.
  44.         */ 
  45.        
  46.         zniszcz(m);
  47.         ileProcesow--;
  48.         idRodzica[m] = -1;     
  49.         ileDzieci[idMojegoRodzica]--;
  50.        
  51.         if(ileDzieci[idMojegoRodzica] == 0){
  52.             /*
  53.                 tutaj umozliwiamy rodzicowi kontynuacje zabijania sie,
  54.                 jezeli wczesniej sie zatrzymal waitem.
  55.                 wait i signal dzialaja tak, ze
  56.                 jezeli nic nie waituje, to nie ma problemu.
  57.                 signal nie bedzie jakos czekal na inny wait,
  58.                 po prostu nic nie wznowi i polecimy dalej.
  59.                 zabijanie tego procesu zakonczy sie poprawnie.
  60.             */
  61.             signal(nieMaDzieci[idMojegoRodzica]);
  62.         }
  63.     }
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement