操作系统: 读者写者问题

操作系统: 读着写者问题

一个数据文件或记录可以被多个进程共享。

只读的进程为“reader进程”,其他进程为“writer进程”。

允许多个对象同时读一个共享对象,但是不允许一个writer进程和其他reader进程同时共享对象。

使用记录性信号量解决读者与写者问题

互斥信号量wmutex:实现reader与writer进程间在读或写时的互斥,

整型变量readcount:表示正在读的进程数目。

由于只要有一个reader进程在读,便不允许writer进程写。

所以,仅当readcount=0,即无reader进程在读时,reader才需要执行wait(wmutex)操作,

若wait(wmutex)操作成功,reader进程便可以去读,相应地,做readercount+1操作。

同理,仅当reader进程在执行了readcount-1操作后其值为0后,才需要执行signal(wmutex)操作,以便让writer进程写

互斥信号量 rmutex:reader进程间互斥访问readcount

总结:

wmutex:是读写时的互斥信号量。

rmutex:是读进程互斥访问readcount的信号量
 

读者优先,会造成写者饥饿现象。(读者优先指的是除非有写者在写文件,否则读者不需要等待)

semaphore wmutex=1;//读写互斥,写写互斥
semaphore rmutex=1;读间访问readcount互斥
int readcount=0;读者进程数
 
reader{
   while(true){
 
     wait(rmutex);获取读间访问readcount互斥信号量
     if(readcount==0)如果之前没有读进程,则先获取读写互斥信号量,对readcount加1,
     wait(wmutex);
     ++readcount;
     signal(rmutex);readcount加1操作完后释放读间访问readcount互斥信号量,开始读
     read;
     wait(rmutex);读完后,对readcount操作加锁,执行readcount减1操作
     --readcount;
     if(readcount==0)没有读进程后,就释放读写互斥锁
     signal(wmutex);
     signal(rmutex);
   }

}
 
writer{
    while(true){
       wait(wmutex);
       write;
       ignal(wmutex);
    }

}
发布了736 篇原创文章 · 获赞 123 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/S_999999/article/details/103647722