当前位置:网站首页>读者写者模型

读者写者模型

2022-07-05 05:21:00 abs(ln(1+NaN))

类似于生产者消费者模型,读者写者模型也是有一份临界资源,两个角色,三种关系,读者写者模型的特点在于 :

(1) 写者(线程)少,读者(线程) 多

(2) 读者不会取走临界资源

画黑板报就是一个典型的读者写者模型,画板报的人只有一个(即写者),但是读黑板报的人有多个(即读者),下面就以这个例子来介绍读者写者模型。


目录

一、模型中的三种关系

1、写者和写者

2、读者和写者

3、读者和读者

二、读写锁加锁/解锁的基本原理

1、读者加锁/解锁

2、写者加锁/解锁

三、优先级问题


一、模型中的三种关系

两个角色指的是读者角色和写者角色,三种关系指的是读者和读者、写者和写者、读者和写者。

1、写者和写者

每次画黑板报的都只能有一个,两个人同时画的话,一个人画消防主题,另一个人却在画动物主题,这并不是我们想看到的。

==》所以写者和写者之间是互斥关系,必须要等一个人画完,才能让下一个画

2、读者和写者

有的时候,你可能认为,画黑板报和读黑板报是可以同时进行的,但是画的过程中,读的人可能无法get到你在画什么,明明你在画龙,读的人却说你在画蛇。这就引起误解了,所以应该等写者画完,读者再读。这是一个理解角度

另一个角度就是,读者还在读,写者却想把板报给擦了,很显然这就矛盾了,所以我们应该让读者读完,写者再擦。

两个角度都说明,读者和写者之间是互斥关系

3、读者和读者

一个人读不会影响另一个人读,这里就不存在什么互斥关系了。==》读者和读者之间没有关系

二、读写锁加锁/解锁的基本原理

Linux为读者写者提供了相应的锁 —— 读者锁和写者锁

我们使用读者的数目作为临界资源,即 int readers = 0;

1、读者加锁/解锁

读者加锁函数的声明如下:

因为读者和读者之间是没有关系的,所以加锁和解锁是两个独立的过程

加锁 = 读黑板报的人加1

解锁 = 读黑板报的人减1

//加锁
lock();
readers++;
unlock();

//解锁
lock();
readers--;
unlock();

2、写者加锁/解锁

写者加锁函数的声明如下:

 当有读者在的时候,即readers 不为0时,写者就无法修改内容,此时加锁以后,必须要等写者写入内容以后,才能解锁

//加锁
lock();
while(readers > 0)
{
    wait();        //进入条件变量等待
}
modify();        //用来表示写者修改内容的操作


//解锁
unlock();        //一般修改完内容就解锁

三、优先级问题

在前面说明读者和写者的关系时,我们从两个角度分析了他们的关系。一个是写者优先,我还没写完,你们都别读;另一个是读者优先,我还没读完,你别擦。

在实际使用的时候,我们更多的会选择读者优先,毕竟少数服从多数,读写者模型的最基本的特征就是读者多,写者少。也就是写者的重要性不如读者。

读者优先:读者和写者同时到来的时候,读者优先进入访问

写者优先:当读者和写者同时到来的时候,比当前写者晚来的读者,都不要进入临界区访问了,等

                临界区没有读者了,即readers = 0时,写者先写入。

原网站

版权声明
本文为[abs(ln(1+NaN))]所创,转载请带上原文链接,感谢
https://blog.csdn.net/challenglistic/article/details/125581934