L-08
L-08
head tail
Producer:
region v when nitems < n do
buf [tail++ % n] = item;
nitems++;
Consumer
region v when nitems > 0 do
item = buf [head++ % n];
nitems--;
return item;
Solution using Monitors
Monitor BoundedBuffer
char buf [n];
int nitems;
int tail, head;
condition empty, full;
// initialization
nitems = tail = head = 0;
Solution with Monitors (cont’d)
Produce(item) Consume(item)
if(nitems == n) if(nitems == 0)
full.wait; empty.wait;
buf [tail++ % n]=item; item = buf [head++ % n];
nitems++; nitems--;
empty.signal; full.signal;
Dining Philosophers
Definition
// Entry(i):
region v when state[(i + 1) % 5] == Thinking
&& state[(i - 1) % 5] == Thinking
do state[i] = Eating;
Solution Using Critical Regions
// Exit(i):
region v when true
do state[i] = Thinking;
Why important?
Transaction systems
File systems
Two Types of Locks on Same Item
Reader preferred:
If a new reader comes in & no one is currently writing, it
gets through even if some writer is waiting to get access
Writer preferred:
If a new writer comes in, it gets through as soon as
possible
Example 1
r1 r2 r3 w4 r5 w6 r7 (lock requests by
threads 1 -- 7)
Reader preferred:
r1 r2 r3: go ahead
w4: wait
r5: go ahead
r1
w6: wait r2 r7 w4, w6
r7: go ahead r3 r5
Example 2
r1 r2 r3 w4 r5 w6 r7 (lock requests by
threads 1 -- 7)
Writer preferred:
r1 r2 r3: go ahead
w4: wait
r5: wait
r1
w6: wait r2 w4, w6, r5, r7
r7: wait r3
Solution Using Critical Regions
Read() {
region v when !writing && !waiting do reading++;
// read
region v when true do reading--; }
Solution Using Critical Regions
Write() {
region v when true do waiting++;
region v when !writing && !reading do
{ waiting--; writing = 1 }
// write
region v when true do writing = 0; }
Solution 2
Read() {
region v when true do waiting++;
region v when !writing do {waiting--; reading++;}
// read
region v when true do reading--; }
Solution 2 (cont’d)
Write() {
region v when !reading && !writing && !waiting
do writing = 1;
// write
region v when true do writing = 0; }
Some Important Properties