mycs

导航

 

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 
posted on 2026-04-18 16:06  Radarman108  阅读(12)  评论(0)    收藏  举报