读写器锁定实现



我有一个家庭作业问题,我必须实现读写器锁。请注意,我不是在寻找/询问代码。我希望了解读写器锁的行为,这将有助于我最终确定实现细节。

假设获取锁的请求遵循以下顺序:R W R W R W R W。。为了防止饥饿,我们是否应该按照相同的顺序处理请求?如果我选择跳过写入请求(从而给读者更高的偏好),我如何确保写入线程不会饿死?

如果给予作者更高的偏好,我认为读者线程可能会饿死。

我认为我目前的计划将适用于RRRRWRRRRWWWRRR、WWWWWWRRRRRRR、RRRRRR、WWWWWWW、RWRRR、WRWWWW等序列。

还有其他我没有考虑的情况吗?-我知道这是一个很难回答的问题,特别是因为我没有透露任何细节,也没有列举我考虑过的所有场景。请容忍我!

"更高优先级"只能在等待时间没有限制的情况下产生饥饿。

如果任何线程可以等待的时间限制在某个有限值内,则该线程不会饿死。

因此,只要你跟踪线程何时进入队列,并且不让它们等待"太久",你就可以在一般情况下(或相反)"优先考虑读取器而不是写入器",同时仍然不会导致活锁。

在聘用一位作家之前,只为最大数量的读者提供服务,也可以获得同样的效果,反之亦然。

读写器系统中饥饿的常见原因是存在"共享"锁,这些锁允许多个读写器锁定同一资源。

writer    reader1    reader2
          LOCK_SH
          obtained
LOCK_EX     |       
waiting     |
   :        |        LOCK_SH
   :        |        obtained
   :        |          |
   :      -------      |
   :                   |
hungry    LOCK_SH      |
   :      obtained     |
   :        |        -------
   :        |
   :        |        LOCK_SH
starving    |        obtained
   :      -------      |
   :                   |
                      ...

如果这只是一个简单的优先选择问题,那么你可以简单地有两个队列,一个用于读者,一个供作家,并为每Y个作家(如果有人在等待)提供X个读者(如果有)。

最新更新