一、读者和写者问题(写者优先方向)
1.写者先占有某信号后,直到最后一个写者走完才释放该信号,读者才能进入。
- 增加一个互斥信号量S,读者和写者都争抢该信号;
- 对写者也进行计数,第1个写者申请S,其他写者不需要申请S;最后一个写者离开时才释放信号量S.
- 一旦写者先申请到了S,则所有的读者只能等待写者都走完才可进入共享读。而多个写者通过S后,仍要争抢wmutex信号以完成互斥的写入。
读者:
wait(s);///实现读者和写者的互斥
wait(rmutex);///第一个读者的互斥
if Readcount=0 then wait(wmutex);
Readcount +1;
signal(rmutex);
signal(s)
读操作
wait(rmutex);///最后一个读者互斥
Readcount -1;
if Readcount=0 then signal(wmutex);
signal(rmutex);
写者:
wait(mutex);///第一个写者互斥
if writecount=0 then wait(s);
writecount+1;
signal(mutex);
wait(wmutex);///实现写者之间的互斥
写操作;
signal(wmutex);
wait(mutex);///最后一个写者互斥
writecount-1;
if writecount=0 then signal(s);
signal(mutex);
二、黑白棋子问题
两个人下棋,一方执黑棋,一方执白棋。要求双方轮流下子。
给出两种情况的解决办法:
1.执黑子一方先下
seamphore bfg=1,wfg=0;
void main()
{
black();
write();
}
///黑子:
void black()
{
while(true){
wait(bfg);
if whereput()
{
put a black qizi;
signal(wfg);
}
else
{
signal(wfg);
break;
}
}
///白子:
void white()
{
while(true){
wait(wfg);
put a white qizi;
signal(bfg);
}
}
2.双方都可以先下,谁先抢到棋盘谁先下。然后开始轮流下子。
seamphore bfg=1,wfg=0,m=1;
boolean fg=F;
void main()
{
black();
write();
}
void black()
{
wait(m);
if(!fg)
{
bfg=1;wfg=0;fg=T;
}
signal(m);
while(true){
wait(bfg);
if whereput()
{
put a black qizi;
signal(wfg);
}else
{
signal(wfg);
break;
}
}
void white()
{
wait(m);
if(!fg)
{
bfg=0;wfg=1;
fg=T;
}
signal(m);
while(true){
wait(wfg);
put a white qizi;
signal(bfg);
}
}
三.嗜睡的理发师问题
一个理发店有N个沙发,1个理发椅;
理发师:
持续睡觉,理发,收钱的动作
顾客:
- 若有沙发,进入等待;否则离开。
- 理发椅空,一顾客放弃沙发,去唤醒它理发;
- 理发后付费,付费完毕离开理发椅,离店。
顾客
Repeat
if count>N then
离开店
else
count=count+1
if count=1 then
wait(empty)等椅子
else
wait(sofa)
坐入沙发
wait(empty)等椅子
离开沙发
signal(sofa)
end if
顾客坐上椅子
singal(full)(叫理发师)
wait(cutok)(享受理发中)
付费
signal(payment)
wait(receipt)
离开椅子
离开店
end if;
Until false
四.生产与销售问题
问题描述
设一无限大仓库。就1个门,不允许同时入库,也不允许边入库边出库。
1)两个生产者A,B生产各自的产品入库;但要求满足关系Sa-Sb在限定的[-n,m]差值范围内。
2)一个销售者取产品销售,但对两种产品的卖出进度要把握在Ma-Mb也在[-n,m]范围内。
同步关系分析
互斥:三人在对仓库的使用上必须互斥(mutex=1)
顺序关系:
1)生产者AB之间:因为假设仓库无限大,不需考虑空的限制。控制其能否生产的关键是再生产一个能否满足Sa-Sb在限定的[-n,m]范围内。
A、B关心的都是各自的生产指标数量,即A关心x=A-B这个变量的值,同样B关心y=B-A。
初值:初始若无产品,A最多可生产m个,B最多可生产n个。自己生产一个必然使对方可以多生产一个。
2)生产与消费之间
关心卖出的A、B间的差值
五、管程
1973年,Hoare和Hanson提出管程思想:
将共享变量及对共享变量能够进行的所有操作集中在一个模块中。
管程的组成:
1.一组局部变量
2.对局部变量操作的一组过程
3.对局部变量进行初始化的语句。
管程的特点:
- 任何进程只能通过调用管程提供的过程入口才能进入管程访问共享数据;
- 就如同使用临界资源,就要先通过其信号量的申请。
- 任何时刻,仅允许一个进程在管程中执行某个内部过程。
操作的同步控制:
靠条件变量的操作管理实现。
进入管程但不能获取资源操作的过程将阻塞,并在满足条件时被唤醒执行。
生产者-消费者问题的管程解决方法:
生产者:
Producer:
begin
repeat
生产an item in nextp;
p_c.put(nextp);
until
end
消费者:
consumer:
begin
repeat
p_c.get(nextc);
消费an item in nextc;
until
end