经典进程同步问题(二)——读者、写者问题
2017-10-09 20:44
267 查看
学习了读者、写者问题,在完成读者优先的算法时发现了一个简单的方法论,感觉豁然开朗,所以首先讲讲我发现的方法论,然后按照这个来解决这个问题。
以上1-5处都会出现错误,自行分析~
假设读者数固定为10。
算法代码参考王昭礼的《操作系统之PV金典》
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金典》
相关文章推荐
- 操作系统进程同步互斥经典问题之读者写者问题
- 经典进程同步问题:读者-写者问题
- 经典进程同步问题:读者-写者问题
- 进程同步的经典问题1——读者写者问题(写者优先与公平竞争)
- 进程同步的经典问题1——读者写者问题(写者优先与公平竞争)
- 进程同步的经典问题1——读者写者问题(写者优先与公平竞争)
- 进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结
- 经典同步问题(三)---读者写者问题
- 进程同步的几个经典题目-生产者消费者-哲学家进餐-读者写者
- 操作系统清华大学版笔记(十) 信号量、管程、条件互斥、经典同步问题(读者写者、哲学家问题)
- 操作系统同步互斥经典问题——读者写者问题
- 经典同步互斥问题之读者—写者问题
- 经典同步问题--读者和写者问题
- 进程同步互斥——读者写者问题
- Java进程间的同步与互斥实例(实现读者写者问题)
- 经典同步问题linux下的C实现:生产者-消费者问题,读者-写者问题,哲学家问题
- 操作系统同步互斥经典问题——读者写者问题
- 操作系统(经典进程同步问题)之写者优先
- 进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结
- 操作系统进程同步三大问题:生产者消费者,哲学家进餐,读者写者问题