Readers and Writers

Leitores têm Prioridade - Readers Have Priority

 

 

Program ReadersWrites_ReadersHavePriority;

 

Var   readCount    : integer;

      MutexR, WSema: Semáforo;

 

Procedure Reader( i: integer );

BEGIN

   Repeat 

      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);

 

                    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 

      AtualizaDados;               /* Atualiza dados a serem gravados */

 

      Down(WSema);                 /* Região Crítica para gravação do DataBase */

                    WriteDataBase;               /* Grava dados no Database */

      Up(WSema);

   Until false;

END;

 

 

BEGIN

  MutexR.valor := 1;    

  WSema.valor  := 1; 

  readCount := 0;

  PARBEGIN

  Reader; Reader; Reader;

  Writer; Writer;

  PAREND;

END.