Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int ileDzieci[N] = {0, ..., 0}
- int idRodzica[N] = {-1, ..., -1}
- int ileProcesow = 1
- cond nieMaDzieci[N];
- int NARODZINY(m){
- int idDziecka;
- if(ileProcesow == N)
- return -1
- //znajdź miejsce w tablicy, gdzie idRodzica == -1
- //pomijamy 0wy proces
- for(int i = 1, i < N, i++){
- if (i != -1){
- idDziecka = i;
- break
- }
- }
- utwórz(idDziecka);
- ileProcesow++;
- idRodzica[idDziecka] = m;
- ileDzieci[m]++;
- return idDziecka
- }
- void ŚMIERĆ(m){
- if(m > 0){ //0wego nie zabijamy
- //zapamietajmy id rodzica zanim je zresetujemy, przyda sie
- int idMojegoRodzica = idRodzica[m];
- if(ileDzieci[m] > 0){
- wait(nieMaDzieci[m]);
- }
- /*
- tu NIE MA ELSE'A!
- wykonywany jest kod po ifie nawet jak wszedl w if!
- jak juz wznowimy signalem tego waita wyzej, to chcemy zeby ten proces
- poprawnie sie zabil dalsza czescia tego kodu,
- a nie zeby opuscil funkcje ŚMIERĆ bez zabijania sie.
- */
- zniszcz(m);
- ileProcesow--;
- idRodzica[m] = -1;
- ileDzieci[idMojegoRodzica]--;
- if(ileDzieci[idMojegoRodzica] == 0){
- /*
- tutaj umozliwiamy rodzicowi kontynuacje zabijania sie,
- jezeli wczesniej sie zatrzymal waitem.
- wait i signal dzialaja tak, ze
- jezeli nic nie waituje, to nie ma problemu.
- signal nie bedzie jakos czekal na inny wait,
- po prostu nic nie wznowi i polecimy dalej.
- zabijanie tego procesu zakonczy sie poprawnie.
- */
- signal(nieMaDzieci[idMojegoRodzica]);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement