操作系统:读者与写者问题

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

只读的进程为“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);
}

以上是读者优先,会造成写者饥饿现象。

猜你喜欢

转载自blog.csdn.net/zyf2695421695/article/details/88777362