读者优先:
|
|
READER:
|
|
WRITER:
|
|
从上边我们可以看出:如果在writer正在等待fmutex的时候,这时一定是已经有多个读者在读取。倘若读者不断地到来,那么writer必然一直处于饥饿的状态。
因此,这种情况下,我们必须想一个措施,让写者的优先级提高。也就是,让写者在“到来”的时候,就要让不断到来的读者停止,让正在读的读者们全部读完之后,写者就开始写。
换句话说,就是要“当写者到的时候,屏蔽源源不断新来的读者,等待已有的读者读完,然后自己进去写”。
因此,輝夜の永遠亭提供了一个思路,就是使用一个queue变量,来限制源源不断的后来读者。
在计算机网络中,我们都知道各种“层”。大体思想无非是,如果有问题解决不了,就加一层;如果还解决不了,就加两层。
这里用了同样的思想。不过用“门”来比喻更好。就是写者在fmutex这个互斥的“门”外边又套了一层门进行把关,一旦写者到来,他就把外边这层门(semaphore queue)封死,因此源源不断的后来读者就全部封死在外边了。接下来就是写者在门里等着,等屋子(fmutex)里的已有的所有读者都读完,然后自己进去写。
思想很简单吧!我们来实现一下。
公平竞争
|
|
READER:
|
|
WRITER:
|
|
哈哈哈。其实我想写成“写者优先”的。结果写完了之后发现时公平竞争TAT。遂把标题从“写者优先”变成了“公平竞争”。
这里我们看到,每个读者和写者都要过门,没过门就不能进。这显然是非常公平的呀!一次只有一个可以进门,这不是公平的是什么?
想要对写者偏心的话,就要改成:只对第一个写者需要过门,然后只要有这第一个写者在这里把关,那么后来源源不断的写者也可以涌入。只不过给后边的写者开小灶,直接免费过门,不需要等了。
回想第一个读者优先也是这样,只要第一个读者进了屋,那么接下来到来的读者不用参与竞争就可以免费进屋了。这里的写者也一样,只要第一个写者进了门,那么接下来到来的写者就可以不用竞争也可以免费过门了。
看下实现:
写者优先
|
|
READER:
|
|
WRITER:
|
|
就完成啦~~