Readers and Writers

Escritores têm Prioridade - Writers Have Priority

 

 Program ReadersWrites_WritersHavePriority;
   
Var readCount, writeCount : integer;
    MutexR, MutexW : Semáforo;
    WSema, RSema, QueueR : Semáforo;
    Procedure Reader( i: integer );
    BEGIN
        Repeat
           Down(QueueR);
           Down(RSema); /* Bloqueia Leitor Enquanto houver Escritor */
            Down
(MutexR); /* Região Crítica para atualizar readCount */
           
readCount := readCount + 1;
            if readCount = 1 then Down(WSema);/* Indica entrada do primeiro Leitor */
            Up
(MutexR);
            Up(RSema);
            Up(QueueR);
            ReadDataBase; /* Lê dados do DataBase */
            Down
(MutexR); /* Região Crítica para atualizar readCount */
           readCount := readCount - 1;
            if readCount = 0 then Up(WSema); /* Indica saída do último Leitor */
            Up
(MutexR);
            ProcessaDados; /* Processa dados lidos */
       
Until false;
   END;

   Procedure Writer( i: integer );
   BEGIN
        Repeat
            Down(MutexW); /* Região Crítica para atualizar writeCount */
           
writeCount := writeCount + 1;
            if writeCount = 1 then Down(RSema);/* Indica entrada do primeiro Escritor */
            Up
(MutexW);
            AtualizaDados; /* Atualiza dados a serem gravados */
            Down
(WSema); /* Região Crítica para gravação do DataBase */
            WriteDataBase; /* Grava dados no Database */
            Up
(WSema);
            Down(MutexR); /* Região Crítica para atualizar writeCount */
            writeCount := writeCount - 1;
            if writeCount = 0 then Up(RSema); /* Indica saída do último Escritor */
            Up(MutexR);
           
       
Until false;
    END;

BEGIN
    MutexR.valor := 1; MutexW.valor := 1;
    WSema.valor := 1; RSema.valor := 1;
    QueueR.valor := 1;
    readCount := 0; writeCount := 0;Q
    PARBEGIN
         Reader; Reader; Reader;
        Writer; Writer;
    PAREND;
END.