信号量解决读者-写者问题

有两组并发进程:读者和写者,共享文件F,要求:
(1)允许多个读者同时对文件进行读操作
(2)只允许一个写者对文件进行写操作
(3)任何写者在完成写操作前不允许其他读者或写者工作
(4)写者在执行写操作前,应让已有的写者和读者全部退出

单纯的引入信号量并不能解决此问题,必须引入计数器readcount对读进程计数,mutex是用于对计数器readcount操作的互斥信号量,writeblock表示是否允许写的信号量。

信号量解决读者-写者问题
int readcount = 0;                      /*读进程计数*/
semaphore writeblock,mutex;     
writeblock = 1;mutex = 1;
cobegin
    process reader_i(){
        P(mutex);
        readcount ++;
        if(readcount == 1)
            P(writeblock);
        V(mutex);
        /*读文件*/
        P(mutex);
        readcount --;
        if(readcount ==0)
            V(writeblock);
        V(mutex);
    }
    process writer_j(){
        P(writeblock);
        /*写文件*/
        V(writeblock);
    }
coend;  

此解法中读者是优先的,当存在读者时,写者将被延迟,且只要有一个读者活跃,随后而来的读者都将被允许访问此文件,从而导致写者长时间等待,并有可能出现写者饥饿现象。

增加信号量并修改此程序,让写者与读者平等:

int readcount = 0;                      /*读进程计数*/
semaphore writeblock,mutex;     
writeblock = 1;mutex = 1;
semaphore s = 1;
cobegin
    process reader_i(){
        P(s);
        P(mutex);
        readcount ++;
        if(readcount == 1)
            P(writeblock);
        V(mutex);
        V(s);
        /*读文件*/
        P(mutex);
        readcount --;
        if(readcount ==0)
            V(writeblock);
        V(mutex);
    }
    process writer_j(){
        P(s);
        P(writeblock);
        /*写文件*/
        V(writeblock);
        V(s);
    }
coend;  
分析

假设进程队列:R1、W1、W2、R2、R3
当R1刚刚执行完V(s),W1进程若调度会卡在P(writeblock),而W2R2R3想要运行,均会卡在P(s),当R1读完,V(writeblock)完成,W1可以运行,以此类推,R1W1W2R2R3按顺序调度。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值