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.