Está en la página 1de 1

El problema de lectores y escritores es uno de los clsicos de la programacin concurrente.

Corresponde a un modelo de interaccin que puede darse cuando en una base de datos existen algunos usuarios o procesos que realizan consultas y otros que actualizan datos. En breve, la descripcin del problema indica que: 1. 2. 3. 4. Existe un rea de datos compartida Los lectores solo pueden leer datos Los escritores solo escriben datos Se debe cumplir con las reglas Cualquier nmero de lectores puede leer simultneamente Solo un escritor puede escribir en un instante dado Si un escritor est modificando datos, ningn lector puede leerlos

En la solucin que se muestra a continuacin, los lectores tiene prioridad sobre los escritores (por qu?). En esta solucin se protege el rea compartida con un semforo y se lleva una cuenta de los lectores. La construccin del escritor es sencilla. Slo debe solicitar acceso al rea comn, escribir y liberar el rea. El cdigo ser el que sigue, asumiendo que buffer es el nombre del semforo que se usar para excluir los lectores de los escritores. while (true) { wait(buffer); /* operaciones de escritura */

signal(buffer); } La construccin del lector es un poco ms complicada, puesto que se debe llevar la cuenta de lectores para que el escritor sea demorado apropiadamente. Para ello se define la variable cuentaLectores y se protege esta variable con el semforo cuentaLectoresSem. De esta manera, los lectores se excluyen mutuamente al actualizar la cuenta de ellos. Adicionalmente, el primer lector en llegar marcar el buffer como ocupado, evitando as que un escritor pueda utilizarlo. En forma simtrica, el ltimo lector marcar el buffer libre al completar su lectura. while (true) { wait(cuentaLectoresSem); cuentaLectores++; if (cuentaLectores == 1) { wait(buffer); } signal(cuentaLectoresSem); /* operaciones de lectura */ // // // // Bloqueo la cuenta de nuevo para avisar que voy de salida Si soy el ltimo lector aviso que el buffer queda libre

// // // //

Bloqueo la cuenta de lectores y la incremento Si soy el nico lector, bloqueo el buffer comn

// Libero la cuenta de lectores

wait(cuentaLectoresSem); cuentaLectores--; if (cuentaLectores == 0) { signal(buffer); } signal(cuentaLectoresSem); }

// y libero la cuenta

Esta solucin no cumple con todos los axiomas de concurrencia. Determine cul o cules no se cumplen y la razn de ello. Existen ms soluciones para este mismo problema, con otras propiedades, las que se mostrarn ms adelante.

También podría gustarte