entra en deadlock la solucion con semaforo dada en el teorico para "lectores- escritores"?

entra en deadlock la solucion con semaforo dada en el teorico para "lectores- escritores"?

de Manolo Alberto Petrillo Soria -
Número de respuestas: 1
si hay cinco escritores y tres lectores, puede pasar lo siguiente:
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)

En respuesta a Manolo Alberto Petrillo Soria

Re: entra en deadlock la solucion con semaforo dada en el teorico para "lectores- escritores"?

de Gustavo Brown -

Manolo,
  Cada escritor toma el semáforo wrt, escribe y luego libera dicho semáforo. 
En tu ejemplo, el primer lector no se bloquea en el P(wrt) porque no hay ningún escritor escribiendo. Por el contrario, toma el semáforo wrt para que no pueda entrar un escritor mientras haya lectores.
El último lector en irse libera el semáfor wrt para que ahora sí un escritor pueda entrar.

Si hubiese un escritor en el momento que entra el primer lector, ahi el lector se bloquea esperando por el semáforo wrt. En ese momento si llegan más lectores, todos se van quedando trancando en el P(S) porque el primer lector aún no liberó ese semáforo. Eventualmente el escritor termina de escribir y hace el V(wrt). En se momento el lector puede tomar el semáforo wrt, y liberar S para que puedan entrar más lectores.

Saludos,
  Gustavo