进程同步——读者、写者问题

一个数据文件可以被多个进程所共享,把只要求读文件的进程成为“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); 
    }
} 

猜你喜欢

转载自www.cnblogs.com/zhai1997/p/12002857.html