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.