producer and consumer
mutex=1
empty=k
full=0
procedure producer
produce a product
p(empty) //申请一个空位
p(mutex) //互斥操作队列
B[in]=product
in=(in+1)%k
v(mutex)
v(full) //释放一个产品
procedure consumer
p(full) //申请一个产品
p(mutex) //互斥操作队列
x=B[out]
out=(out+1)%k
v(mutex)
v(empty) //释放一个空位
consumer x
//互斥操作 要紧靠临界区 防止停在互斥区域造成死锁
readers and writers
reader:
p(mutex)
readconut=readconut+1
if(readconut==1)p(r_w_w)//第一次读要获得控制权
v(mutex)
{读操作}
p(mutex)
readconut=readconut-1
if(readcoonut==0)v(r_w_w)//没有最后一次读后要释放控制权
v(mutex)
writer:
p(r_w_w)
{写操作}
v(r_w_w)
dining philosophers problem
procedure test() //原子化检测 防止全部哲学家拿起左叉造成死锁
if(state[i]=hungry)and(state[(i-1)mod5]<>esting)and(state[(i+1)mod5]<>eating)
then {state[i]=eating
v(self[i])}
pi:
thinking
p(mutex) //互斥检查能否进餐 防止进入后冲突
state[i]=hungry
test(i)
v(mutex)
p(self[i]) //等待自己检查成功 或 相邻哲学家进餐后检查成功
取左叉 取右叉
进食
放左叉 放右叉
p(mutex)
state[i]=thinking
test((i-1)mod5)
test((i+1)mod5)
v(mutex)
//为解决一个哲学家相邻的哲学家总存在进餐从而饿死问题
//可以奇数偶数哲学家间隔检查
cigarette smokers problem
shared t,w,m(0,0,0)
s(1)
Process X
loop
p(s);
sv(t,1;m,1);
endloop
Process Y
loop
p(s);
sv(m,1;w,1);
endloop
Process Z
loop
p(s);
sv(t,1;w,1);
endloop
----------------
Process A
loop
sp(m,1,1;w,1,1);
smoke;
v(s)
endloop
Process B
loop
sp(w,1,1;t,1,1);
smoke;
v(s)
endloop
Process C
loop
sp(t,1,1;m,1,1);
smoke;
v(s)
endloop
//sp(s1,t1,d1;...)
//如果所有si都满足阈值 则可以进入并减去步长
//如果有一个si不满足阈值 则放入第一个不满足的等待队列
//唤醒时重新检测所有si
浙公网安备 33010602011771号