Martin C. Rinard
data[10] - a buffer holding produced data.
num - tells how many produced data items there are in the buffer.
Produce(v) called when
producer produces data item v. Consume(v) called
when consumer is ready to consume a data item. Consumed item put
into v.
bufferAvail - signalled when a buffer becomes available.
dataAvail - signalled when data becomes available.
monitor {
Condition *bufferAvail, *dataAvail;
int num = 0;
int data[10];
Produce(v) {
while (num == 10) { /* Mesa semantics */
bufferAvail->Wait();
}
put v into data array
num++;
dataAvail->Signal(); /* must always do this? */
/* can replace with broadcast? */
}
Consume(v) {
while (num == 0) { /* Mesa Semantics */
dataAvail->Wait();
}
put next data array value into v
num--;
bufferAvail->Signal(); /* must always do this? */
/* can replace with broadcast? */
}
}
Condition *bufferAvail, *dataAvail;
int num = 0;
int data[10];
Lock *monitorLock;
Produce(v) {
monitorLock->Acquire(); /* Acquire monitor lock - makes operation atomic */
while (num == 10) { /* Mesa semantics */
bufferAvail->Wait(monitorLock);
}
put v into data array
num++;
dataAvail->Signal(monitorLock); /* must always do this? */
/* can replace with broadcast? */
monitorLock->Release(); /* Release monitor lock after perform operation */
}
Consume(v) {
monitorLock->Acquire(); /* Acquire monitor lock - makes operation atomic */
while (num == 0) { /* Mesa Semantics */
dataAvail->Wait(monitorLock);
}
put next data array value into v
num--;
bufferAvail->Signal(monitorLock); /* must always do this? */
/* can replace with broadcast? */
monitorLock->Release(); /* Release monitor lock after perform operation */
}
}
Permission is granted to copy and distribute this material for educational purposes only, provided that the following credit line is included: "Operating Systems Lecture Notes, Copyright 1997 Martin C. Rinard." Permission is granted to alter and distribute this material provided that the following credit line is included: "Adapted from Operating Systems Lecture Notes, Copyright 1997 Martin C. Rinard."