Problema dos Leitores e Escritores: O problema é uma abstração do acesso a uma base de dados, onde não deve existir o perigo em se ter diversas threads (leitoras) lendo concorrentemente, mas escrevendo ou mudando os dados (escritores), deve ser feito sob exclusão mútua para garantir consistência. Readers: Threads as quais não são requeridas a excluirem uma a outra.São bem sucedidos e passadas a Start_Read e estão concorrentemente lendo. Writers: Threads que são requeridos excluirem todo outra thread, leitores e escritores. Writing: um flag que é verdadeiro quando uma thread está escrevendo. Existem duas variáveis de condições: Ok_to_Read: para suspender leitores. Ok_to_Write: para suspender escritores. Funcionamento: Um leitor é suspenso se algum escritor está correntemente escrevendo (Writing) ou algum escritor está esperando para escrever (Non-Empty(OK_to_Write), ou seja, esta condição serve para dar ao primeiro escritor suspenso, prioridade sobre leitores esperando. Por outro lado, um escritor é suspenso se existem leitores correntemente lendo (Readers <> 0) ou escritores escrevendo (Writing). Resumindo: (a) Se existem escritores suspensos, a novo leitor é requerido esperar até o término de (ao menos) o primeiro escritor. (b) Se existem leitores suspensos, eles (todos) serão liberados, antes do próximo escritor. -------------------------------------------------------------- monitor Readers_Writers_Monitor is Readers: Integer := 0; Writing: Boolean := False; Ok_to_Read, Ok_to_Write: Condition; procedure Start_Read is begin if Writing or Non_Empty(Ok_to_Write) then wait(Ok_to_Read); Readers := Readers + 1; Signal(Ok_to_Read); end Start_Read; procedure End_Read is begin Readers := Readers - 1; if Readers = 0 then Signal(Ok_to_Write); end if; procedure Start_Write is begin if Readers /= 0 or Writing then Wait(Ok_to_Write); end if; Writing := True; end Start_Write; procedure End_Write is begin Writing := False; if No_Empty(Ok_to_Read) then Signal(Ok_to_Read); else Signal(Ok_to_Write); end if; end End_Write; end Readers_Writers_Monitor. -----------------------------------------------------------------