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

来源:互联网 发布:股票日记软件 编辑:程序博客网 时间:2024/06/08 12:35

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

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

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 0
原创粉丝点击