escriben "secuencialmente" los tres primeros escritores una vez cada uno, dejando tres datos para leer; luego intenta leer el primer lector, pero se bloquea en el if( cant_lect_activos ==1), haciendo un P(wrt), y desde acá queda trancado para siempre el lector en cuestión? porque según veo, ningún otro escritor puede escribir porque se tranca en el P(wrt), y los lectores restantes escriben pero nunca entran en el if( cant_lect_activos == 0) then V(wrt), por lo tanto nunca desbloquea al P(wrt) del primer lector trancado. Que pasó? copié mal la solución?:
PROGRAM L - E
var wrt, s : semaforo;
cant_lect_activos : integer;
PROCEDURE LECTOR
loop
P(s);
cant_lect_activos := cant_lect_activos + 1;
if( cant_lect_activos == 1) then
P(wrt);
V(s);
LEER();
P(s);
cant_lect_activos := cant_lect_activos - 1;
if( cant_lect_activos == 0) then
V(wrt);
V(s);
endloop
END
PROCEDURE ESCRITOR
loop
P(wrt);
ESCRIBIR();
V(wrt);
endloop
END
begin //principal
INIT(wrt, 1), INIT(s, 1);
cant_lect_activos := 0;
cobegin
LECTOR; LECTOR; LECTOR;
ESCRITOR; ESCRITOR; ESCRITOR; ESCRITOR; ESCRITOR;
coend
end // principal
(Editado por Gustavo Brown (formateo del código)