- Declaración de variables globales
semáforo lecMutex; // para modificar el numero de lectores
semáforo escMutex; // para modificar el numero de escritores
semáforo lectores; // para bloquear a los lectores cuando están los escritores
semáforo escritores; // para que solo esté un escritor en la S.C. a la vez
int nEscritores=0; // número de escritores en la S.C.
int nLectores=0; // número de lectores en la S.C.
- Inicialización
init( lecMutex, 1);
init( escMutex, 1);
init( lectores, 1);
init( escritores, 1);
- Lector
while(true){
wait(lectores);
wait(lecMutex);
nLectores++;
if(nLectores == 1)
wait(escritores)
signal(lecMutex)
signal(lectores);
// leer
wait(lecMutex);
nLectores--;
if(nLectores == 0)
signal(escritores);
signal(lecMutex)
}
- Escritor
while(true){
wait(escMutex);
nEscritores++;
if(nEscritores == 1)
wait(lectores)
signal(escMutex)
wait(escritores);
// escribir
signal(escritores);
wait(escMutex);
nEscritores--;
if(nEscritores == 0)
signal(lectores);
signal(escMutex);
}
Nota: Las variables
nLectores y
nEscritores son
globales ya que si fueran locales al empezar un hilo se inicializan a 0 una y otra vez.