读者写者问题(semaphore)

读者优先算法

设置两个互斥信号量:rwmutex 用于写者与其他读者/写者互斥的访问共享数据
                    rmutex  用于读者互斥的访问读者计数器readcount

var rwmutex, rmutex  semaphore := 1,1 
int readcount = 0; 
cobegin
       readeri begin  // i=1,2,….
              P(rmutex);
              Readcount++;
              If (readcount == 1) P(rwmutex);
              V(rmutex);
              读数据;
              P(rmutex);
              Readcount--;
              If (readcount == 0) V(rwmutex);
              V(rmutex);
       End
       Writerj begin // j = 1,2,….
              P(rwmutex);
              写更新;
              V(rwmutex);
       End 
Coend 

写者优先:

条件:

1)多个读者可以同时进行读
2
)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)
3
)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)

1:如果读者数是固定的,我们可采用下面的算法:

rwmutex:用于写者与其他读者/写者互斥的访问共享数据
rmutex
该信号量初始值设为10,表示最多允许10个读者进程同时进行读操作

var rwmutex, rmutex semaphore := 1,10
cobegin
       readeri begin  // i=1,2,….
              P(rwmutex);  //
读者、写者互斥
              P(rmutex);
              V(rwmutex);  //
释放读写互斥信号量,允许其它读、写进程访问资源
             
读数据;
              V(rmutex);
       End             

       Writerj begin // j = 1,2,….
              P(rwmutex);
              For (i=1;i<=10;i++) P(rmutex); //
禁止新读者,并等待已进入的读者退出
             
写更新;
              For (i=1;i<=10;i++) V(rmutex); //
恢复允许rmutex 值为10
              V(rwmutex);
       End
Coend

 

2:如果读者数不固定,采用下面的算法:

设置三个互斥信号量:rwmutex 用于写者与其他读者/写者互斥的访问共享数据
                    rmutex 
用于读者互斥的访问读者计数器readcount                                                   nrmutex 用于写者等待已进入读者退出,所有读者退出前互斥写操作

var rwmutex, rmutexnrmutex semaphore := 111
int readcount = 0;
cobegin
       readeri begin  // i=1,2,….
              P(rwmutex);
              P(rmutex);
              Readcount++;
              If (readcount == 1) P(nrmutex); //
有读者进入,互斥写操作
              V(rmutex);
              V(rwmutex); //
及时释放读写互斥信号量,允许其它读、写进程申请资源
             
读数据;
              P(rmutex);
              Readcount--;
              If (readcount == 0) V(nrmutex); //
所有读者退出,允许写更新
              V(rmutex);
       End

       Writerj begin // j = 1,2,….
              P(rwmutex);  //
互斥后续其它读者、写者
              P(nrmutex);  //
如有读者正在读,等待所有读者读完
             
写更新;
              V(nrmutex);   //
允许后续新的第一个读者进入后互斥写操作
              V(rwmutex);  //
允许后续新读者及其它写者
       End
Coend

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值