参考博客
http://blog.sina.com.cn/s/blog_a3eacdb20101ct0c.html
读者写者问题
(1)允许多个读者同时执行读操作;
(2)不允许读者、写者同时操作;
(3)不允许多个写者同时操作。
Reader和Writer的同步问题分为读者优先、弱写者优先(公平竞争)和强写者优先三种情况,它们的处理方式不同。
(1)读者优先。
对于读者优先,应先满足下列条件
如果新读者到:
①无读者、写者,新读者可以读;
②有写者等待,但有其它读者正在读,则新读者也可以读;
③有写者写,新读者等待。
如果新写者到:
①无读者,新写者可以写;
②有读者,新写者等待;
③有其它写者,新写者等待。
http://blog.sina.com.cn/s/blog_a3eacdb20101ct0c.html
读者写者问题
(1)允许多个读者同时执行读操作;
(2)不允许读者、写者同时操作;
(3)不允许多个写者同时操作。
Reader和Writer的同步问题分为读者优先、弱写者优先(公平竞争)和强写者优先三种情况,它们的处理方式不同。
(1)读者优先。
对于读者优先,应先满足下列条件
如果新读者到:
①无读者、写者,新读者可以读;
②有写者等待,但有其它读者正在读,则新读者也可以读;
③有写者写,新读者等待。
如果新写者到:
①无读者,新写者可以写;
②有读者,新写者等待;
③有其它写者,新写者等待。
单纯使用信号量不能解决读者与写者问题,
引入计数器rCount 对读进程进行计数;
rCountMutex 是用于对计数器rCount 操作的互斥信号量(Semaphore );rwMutex表示是读者与写者互斥的信号量;
于是读者优先的程序设计如下:
伪代码:
int rCount=0;
int rCountMutex=1;
int rwMutex=1;
void reader(){
P(rCountMutex);
rCount++;
if(rCount==1)P(rwMutex);
V(rCountMutex);
读操作;
P(rCountMutex);
rCount--;
if(rCount==0)V(reMutex);
V(rCountMutex);
}
void writer(){
P(rwMutex)
写操作;
V(rwMutex);
}
源代码下载:
http://pan.baidu.com/s/1bn8L9Ob