读写者的四种优先调度方式

读写者是一个著名的问题:

        一个黑板,读者可以读取黑板上的东西,写者可以向黑板上写东西.并且有如下规则:

1.可以有多个读者同时读取黑板上的数据

2.只能有一个写者在黑板上写东西.

3.读者和写者不能同时操作黑板,即读写不能同时发生.

 

读者优先方法:


        读者队列和写者队列,读者和写者抢夺黑板的控制权.每当读者获得黑板控制权以后就会将写者阻塞在黄线上,并且连续到来的读者可以畅通无阻的读取黑板上的数据.

        而当写者获得控制权后只能用于自己,自己操作完黑板后,后续写者还是要和到来的读者竞争.这样就会造成读者优先享有黑板控制权.准确的说读者会一次获得,直到上一个读者读完黑板数据还没有读者到来,这样就会交出控制权(家族性质,维护团体权益,为后面的读者着想.).而写者就自己单干,每次执行完后都会交出控制权.

代码:

reader(){
    p(rmutex);
     r++;
    if(r==1) p(ws);//1
     v(rmutex);
 
    读取数据;
 
     p(rmutex);
     r++;
    if(r==0) v(ws);
v(rmutex);
}  
write (){
    p(ws)
	写;
	v(ws)

}

读者写者交替执行.

        由于读者家族护短,总是维护自己家族的人,写者就想,我也要维护自己家族的人,即读者和写者各自都要维护后续到来的自己人.


        

reader(){
    p(rs)
    p(rmutex);
     r++;
//维护读者家族,阻塞写者家族
    if(r==1) p(ws);//1
     v(rmutex);
     v(rs)
       
    读取数据;

     p(rmutex);
     r--;
    if(r==0) v(ws);
     v(rmutex);
}   
write (){
    p(wmutex);
     w++;
    //维护写者家族,阻塞读者家族
    if(w==1) p(rs);     
    v(wmutex);
	
    p(ws)
      写数据;
      v(ws)

     p(wmutex);
     w--;
    if(w==0) v(rs);
     v(wmutex);
}

      由于读者和写者两个家族总是护短,终于有一次大大出手,最后商定,我们都不管了,让后辈自己去争吧.

        就像这样,读者不会阻塞写者,写者也不阻塞读者,每一个新到来的读者和写者总是一起竞争.

 


代码:

 

reader(){
    p(s)
    p(rmutex);
     r++;
//写者和读者不能同时存在
    if(r==1) p(ws);//1
     v(rmutex);
     v(s)
       
    读取数据;

     p(rmutex);
     r++;
    if(r==0) v(ws);
     v(rmutex);
}   
reader(){
    p(s)
    p(wmutex);
     w++;
//写者和读者不能同时存在
    if(r==1) p(rs);//1
     v(wmutex);
     v(s)
       
    p(ws)
    写数据;
    v(ws)

     p(wmutex);
     w++;
    if(w==0) v(rs);
     v(wmutex);
}   

        由于读者家族新生一辈很强悍,打得写者家族遍历鳞伤,于是写者家族重启保护后一辈(后续到来的写者)的政策.

就像这样:

 



reader(){
    p(s)
    p(rmutex);
     r++;
//写者和读者不能同时存在
    if(r==1) p(ws);//1
     v(rmutex);
     v(s)
       
    读取数据;

     p(rmutex);
     r++;
    if(r==0) v(ws);
     v(rmutex);
}   

writer(){
    p(wmutex);
     w++;
//维护读者家族,阻塞写者家族
    if(r==1) p(s);//1
     v(wmutex);
       
    p(ws)
    写数据;
    v(ws)

     p(wmutex);
     w++;
    if(w==0) v(s);
     v(wmutex);
}   

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值