老狗——信号量习题

一、读者和写者问题(写者优先方向)

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个门,不允许同时入库,也不允许边入库边出库。

1)两个生产者A,B生产各自的产品入库;但要求满足关系Sa-Sb在限定的[-n,m]差值范围内。

2)一个销售者取产品销售,但对两种产品的卖出进度要把握在Ma-Mb也在[-n,m]范围内。

2.同步关系分析

互斥:三人在对仓库的使用上必须互斥(mutex=1)

顺序关系:

  1. 生产者AB之间:因为假设仓库无限大,不需考虑空的限制。控制其能否生产的关键是再生产一个能否满足Sa-Sb在限定的[-n,m]范围内。

A、B关心的都是各自的生产指标数量,即A关心x=A-B这个变量的值,同样B关心y=B-A。

初值:初始若无产品,A最多可生产m个,B最多可生产n个。自己生产一个必然使对方可以多生产一个。
生产者AB间关系
2) 生产与消费之间

关心卖出的A、B间的差值
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值