- - - - CENAPAD-MGCO

A seguir: 5a. Questão Acima: Marcelo Bernardes Vieira Anterior: 3a. Questão


4a. Questão

Considerações iniciais:

a) Programa cliente:

        void cliente() {
                if(RequestBarbeiro()) {
                        // Utiliza recurso

                        ReleaseBarbeiro();
                }
        }

b) Controlador da barbearia:

        int sentados;   key mutex; TicketQueue  waiting;
        int ocupado=0;

        boolean RequestBarbeiro() {
              lock(mutex);
                if(sentados >= 5) {
                        unlock(mutex);
                        return FALSE;
                }

                int myticket = waiting.GetTicket();
                sentados++;
                while(waiting.IsTheBest(myticket) || ocupado == 1)
                        wait(b, mutex);

                waiting.Ok(myticket);
                sentados--;
                ocupado = 1;
              unlock(mutex);
        }

        void ReleaseBarbeiro() {
              lock(mutex);
                wakeup(b, mutex);
                ocupado = 0;
              Unlock(mutex);
        }

c) Fila de prioridades:

        int ticket=0;   OrderedQueue q;

        int GetTicket() {
                q.put(++ticket);
                return( ticket );
        }

        boolean IsTheBest(int ticket) {
                return(q.top == NULL || q.top == ticket);
        }

        void Ok(int ticket) {
                if(ticket != q.pop()) {
                        ERRO;
                }
        }



Osvaldo Carvalho - Postscript - Comentários?