操作系统: 读着写者问题
一个数据文件或记录可以被多个进程共享。
只读的进程为“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);
}
}