Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1Aproximacin errnea
4Vase tambin
Aproximacin errnea[editar]
Para resolver el problema cualquier programador podra llegar a la solucin que se muestra a
continuacin. En la misma se utilizan dos bibliotecas, sleep y wakeup . La variable
global itemCount contiene el nmero de elementos en el buffer.
int itemCount = 0;
procedure producer() {
while (true) {
item = produceItem();
if (itemCount == BUFFER_SIZE) {
sleep();
}
putItemIntoBuffer(item);
itemCount = itemCount + 1;
if (itemCount == 1) {
wakeup(consumer);
}
}
}
procedure consumer() {
while (true) {
if (itemCount == 0) {
sleep();
}
item = removeItemFromBuffer();
itemCount = itemCount - 1;
if (itemCount == BUFFER_SIZE - 1) {
wakeup(producer);
}
consumeItem(item);
}
}
El problema con esta aproximacin es que puede caer en un deadlock, considere el siguiente
escenario:
1. El consumidor acaba de consultar la variable itemCount , nota que es cero y pasa a
ejecutar el bloque if .
2. Justo antes de llamar a la funcin sleep() el consumidor es interrumpido y el
productor comienza a trabajar.
3. El productor crea un objeto, lo agrega al buffer y aumenta itemCount .
4. Como el buffer estaba vaco antes de la ltima adicin el productor intenta despertar al
consumidor.
up(emptyCount);
consumeItem(item);
}
}
procedure consumer() {
while (true) {
down(fillCount);
down(mutex);
item = removeItemFromBuffer();
up(mutex);
up(emptyCount);
consumeItem(item);
}
}
wait(empty);
}
item = removeItemFromBuffer();
itemCount = itemCount - 1;
if (itemCount == BUFFER_SIZE - 1) {
notify(full);
}
return item;
}
}
procedure producer() {
while (true) {
item = produceItem()
ProducerConsumer.add(item)
}
}
procedure consumer() {
while (true) {
item = ProducerConsumer.remove()
consumeItem(item)
}
}
Ntese el uso de la sentencia while cuando se comprueba si el buffer est lleno o vaco.
Con mltiples consumidores hay un race condition cuando un consumidor es notificado que un
objeto ha sido puesto en el buffer pero otro consumidor que est esperando en el monitor lo
extrae del buffer antes. Si en vez de una sentencia while se usa un if muchos objetos
pueden ser agregados a un buffer lleno o removidos de un buffer vaco.