读者---写者问题
2018-03-28 14:18
148 查看
问题描述:
一个数据文件或记录可被多个进程共享,我们把只要求读该文件的进程称为:Reader进程,其他进程称为Writer进程。允许多个文件同时读一个共享对象,因为读操作不会使数据文件混乱。但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对象,否则会引起混乱。解决方案:
1.利用记录型信号量解决读者-写者问题为实现Reader与Writer进程间在读或写时的互斥二设置一个互斥信号量wmutex。另外,在设置一个整形变量readcount表示正在读的进程数目。由于只要有一个Reader进程在读,便不允许Writer进程去写。因此,仅当readcount=0,表示尚无Reader进程在读时,Reader进程才需要执行wait(wmutex)操作。若wait(wmutex)操作成功,Reader 进程便去读,相应的做readcount+1操作。听力,仅当Reader进程执行了Readercount-1操作后之为0,才执行signal(wmutex),以便让Writer进程写操作。又因为readcount是一个可被多个Reader进程访问的临界资源,因此,也应该为它设置一个互斥信号量rmutex。
2.问题描述代码如下 semaphore rmutex=1; //初始化信号量rmutex,保证对于readcount的互斥访问
semaphore mutex=1; //初始化信号量mutex,保证对于数据区的写互斥
int readcount=0; //用于记录读者数量,初值为0
reader(){
while(true){
wait(rmutex); //申请readcount的使用权
if(readcount==0) wait(wmutex); //如果此为第一个读者,阻止写者进入
readcount++; //读者数量加1
signal(rmutex); //释放readcount的使用权,允许其他读者使用——————疑问2
进行读操作;
wait(rmutex); //申请readcount的使用权,要对其进行操作
readcount--; //读者数量减一
if(readcount==0)signal(wmutex); //若没读者了,则允许写者进入
signal(rmutex); //释放readcount的使用权,允许其他读者使用
}
}
writer(){
while(true){
wait(wmutex); //申请对数据区进行访问
进行写操作;
signal(wmutex); //释放数据区,允许其他进程读写;
相关文章推荐
- win32 pv操作 读者写者问题
- OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)
- (操作系统原理·第三章)读者-写者问题
- 秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock
- 多线程---读者写者问题
- 读者写者问题(读者优先、写者优先、公平竞争)
- 读者写者问题
- 读者-写者问题 写者优先与公平竞争
- Java实现生产者消费者问题与读者写者问题
- 现代操作系统-读者/写者问题
- 基于信号量与P/V操作同步机制的读者/写者问题的设计与实现 (写者优先)
- 用信号量解决读者写者问题
- 多线程13: 读者写者问题继 读写锁SRWLock
- 读者写者问题
- 秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock
- linux中关于IPC(一部分涉及读者写者问题)
- 读写锁解决读者与写者问题
- 操作系统清华大学版笔记(十) 信号量、管程、条件互斥、经典同步问题(读者写者、哲学家问题)
- 操作系统中读者-写者问题的一点疑问
- 操作系统PV操作及读者写者问题