操作系统:读者与写者问题
程序员文章站
2022-07-04 23:47:13
...
一个数据文件或记录可以被多个进程共享。
只读的进程为“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);
}
以上是读者优先,会造成写者饥饿现象。
上一篇: Rust 文件