题干:教材中提供的读者-写者问题的解决方案存在读者优先问题,即当有一个读进程比较活跃时,随后而来的读进程都将被允许访问资源。这样,会导致写进程可能长时间等待。而这种情况往往与实际应用需求相背。
- 分析教材中的程序
教材中为读者优先,其特点有写者、读者互斥访问文件资源,多个读者可以同时访问文件资源(通过readcount来控制),只允许一个写者进行写的操作(通过wmutex控制),只要有读者这在读,就不允许写者进入。
由此可看出除非有写者在写,否则读者不需要等待,读者处于高优先级进程,写者处于低优先级进程,两者通过变量wmutex完成互斥。从而导致写进程长时间的等待。
- 设计思想
为使得两者公平竞争,还需满足
(1)读者写者的优先级相同
(2)读者、写者互斥访问
(3)只允许有一个写者访问临界区
(4)可以有多个读者同时访问临界区的资源
3、实现方法
(1)设置rw 信号量实现对临界资源的互斥访问。
(2)设置计数器readcount实现多个读者访问临界资源,通过设置信号量mutex实现对readcount 计数器的互斥访问。
(3)设置信号量w实现读者和写者的公平竞争
4、实现代码
int readcount=0;
semaphore w=1, mutex =1;
Reader()
{
While(true)
{
wait (w);
wait (mutex);
if (readcount == 0)
wait(rw);
readcount++;
signal (mutex);
signal (w);
…
perform read operation
…
wait (mutex);
readcount--;
if (readcount == 0)
signal (rw);
signal (mutex);
}
}
Writer()
{
While(true)
{
wait(w);
wait(rw);
…
perform write operation
…
signal(rw);
signal(w);
}
}