一个数据文件可以被多个进程所共享,把只要求读文件的进程成为“Reader进程”,其他进程称为“Writer进程”,允许多个进程读,但是不允许一个Writer进程和其他进程一起读或者写。
读者:
在读者问题中,把readcount当成了互斥信号量,在执行readcount减减或加加之前都要指向p操作。
semaphore rmutex=1,wmutex=1; //rmutex信号量保证多个Reader进程对互斥资源的访问,这里把readcount当作了互斥资源 //wmutex信号量保证读写进程的互斥 int readcount=0;//正在读的进程数目 void reader(){ while(1){ wait(rmutex); if(readercount==0) wait(wmutex);//只有没有进程读的时候 ,执行 p 操作,不允许其他进程写 , //因为信号量为1,执行 p操作后信号量的值变为0 readcounter++; signal(rmutex); ... ... wait(rmutex); readcount--; if(readcount==0)//表示是最后一个读者,没有读者占用了 signal(wmutex); signal(rmutex); } }
写者:
semaphore wmutex=1;//wmutex信号量保证读写进程的互斥 void Writer(){ while(1){ wait(wmutex);//检查是否有人读或写 写操作; signal(wmutex); } }