您的位置:首页 > 其它

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

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

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金典》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐