经典进程同步问题(二)——读者、写者问题

学习了读者、写者问题,在完成读者优先的算法时发现了一个简单的方法论,感觉豁然开朗,所以首先讲讲我发现的方法论,然后按照这个来解决这个问题。

1、找出问题
2、分析问题成因
3、根据成因提出解决方案

这里写图片描述

读者优先:

//此版本有瑕疵,完整版本烦请继续阅读

Semaphore rwmutex = 1;//用于写者与其他读者/写者互斥访问共享数据
int rcount = 0;//读者计数器
cobegin
    proceduer reader
    {
        rcount ++ ;//----------1
        if(rcount == 1) P(rwmutex);
        //----------2
        读数据;//----------3
        rcount -- ;
        //----------4
        if(rount == 0) V(rwmutex);
    }

    proceduer writer
    {
        P(rwmuten);
        写数据;//----------5
        V(rwmutex);
    }
coend

以上1-5处都会出现错误,自行分析~

//完整版本
Semaphore rwmutex = 1;//用于写者与其他读者/写者互斥访问共享数据
Semaphore rmutex = 1;//用于读者互斥访问
int rcount = 0;//读者计数器
cobegin
    proceduer reader
    {
        P(rmutex);//防止“++”操作被打断
        rcount ++ ;
        if(rcount == 1) P(rwmutex);
        V(rmutex);
        读数据;
        P(rmutex);//防止“--”操作被打断
        rcount -- ;
        if(rount == 0) V(rwmutex);
        V(rmutex);
    }

    proceduer writer
    {
        P(rwmuten);
        写数据;
        V(rwmutex);
    }
coend

写者优先:

即唤醒时优先考虑写者。
假设读者数固定为10。

Semaphore rwmutex = 1;//用于写者与其他读者/写者互斥的访问共享数据
Semaphore rmutex = 10;//表示最多10个读者进行读操作
cobegin
    procedure reader
    {
        P(rwmutex);//读者、写者互斥
        P(rmutex);
        V(rwmutex);//释放读写互斥信号量,允许其他读、写进程访问资源;
        读数据;
        V(rmutex);
    }

    procedure writer
    {
        P(rwmutex);
        for(int i = 1;i <= 10;i++) P(rmutex);//禁止新读者,并等待已进入的读者退出
        写数据;
        for(int i = 1;i <= 10;i++) V(rmutex);//恢复允许rmutex 值为10
        V(rwmutex);
    }
coend

算法代码参考王昭礼的《操作系统之PV金典》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值