1、 问题描述:有读者和写者两组并发进程,共享一个文件,当两个以上的读进程同时访问共享数据时不会产生副作用,若某个写进程和其他进程同时访问共享数时,则可能导致数据不一致错误。因此要求:1:允许多个读者同时对文件执行读操作 2:只允许一个写者往文件中写信息;3:任一写者在完成写操作之前不允许其它读者写工作 4:写者执行写操作之前,应让已有的读者和写者全部退出。 2、 关系分析:读者和写者是互斥的,写者和写者也是互斥的,而读者和读者不存在互斥问题 3、 整理思路:两个进程,即读者和写者。写者和任何进程互斥,用互斥信号量P操作,V操作即可解决。读者的问题比较复杂,它必须实现与写者互斥的同时还要实现与其他读者的同步,因此,用到了一个计数器,用来判断当前是否有读者读文件。当有读者的时候,写者无法写文件,此时读者会一直占用文件,当没有读者的时候才可以写文件。同时这里不同读者对计数器的访问也是互斥的。 4、 信号量设置:设置count为计数器,用来记录当前读者数量初始值为0;设置mutex为互斥信号量,用于保护更新count变量时的互斥;设置互斥信号量rw用于保护读者和写者的互斥访问。 5、 描述代码如下:(读进程优先) Int count=0; //用于记录当前的读者数量 Semaphore mutex=1; //用于保护户更新count变量时的互斥 Semaphpore rw=1; //用于保证读者和写者互斥地访问文件 Writer(){ //写者进程 While(){ P(rw);//互斥访问count变量 Writing; //写入 V(rw); }} Reader(){ //读者进程 While(1){ P(mutex); //互斥访问count变量 If(count0) //当第一个读者读共享文件时 P(rw); //阻止写进程写 count++; //读者计数加1 V(mutex); //释放互斥变量count变量 Reading; P(mutex); //互斥访问count变量 count–; //读者计数器减1 if(count0) //当最后一个读进程读完共享文件 V(rw); //允许写进程写 V(mutex); //释放互斥变量count }}
6、 写进程优先(相对的):有写进程请求访问,这时应禁止后续进程的请求,等待已在共享文件的读进程执行完毕,则立即让写进程执行,只有无写进程执行的情况下才允许进程再次运行。 Int count=0;//用于记录当前的读者数量 Semaphore mutex=1;//用于保护更新count变量时的互斥 Semaphore rw=1;//用于保证读者和写者互斥地访问文件 Semaphore w=1 //用于实现“写优先” Write(){ //写者进程 While(1){ P(w); //在无写进程请求时进入 P(rw); //互斥访问共享文件 Writing; //写入 V(rw)//释放共享文件 V(w);//恢复对共享文件的访问 }}
Reader(){ //读者进程 While(1){ P(w); //在无写进程请求时进入 P(mutex); //互斥访问count变量 If(count0) //当第一个读集成读共享文件时 P(rw);//阻止写进程写 count++; //读者计数器加1 V(mutex); //释放互斥变量count V(w); //恢复对共享文件的访问 Reading;//读取 P(mutex); //互斥访问count变量 Count–; //读者计数器减1 If(count0) //当最后一个读进程读完共享文件 V(rw); //允许写进程写 V(mutex); //释放互斥变量count }}